سؤال

وتطبيق لقد بدأت مؤخرا العمل على أن يسجل اثنين دلل "، وبسبب اكتف".

وهذا يجعل من الصعب الحصول على نسخة متعددة من الطلب الحالي على جهازك - يقول النسخة المنتج المثبت، والتصحيح وطرح إصدارات أحدث مصادر التنمية.

ما هي البدائل لتسجيل ل ActiveX.

هل كانت مفيدة؟

المحلول

إذا طلبك يحمل كائنات ActiveX، وهناك زوجين من الخيارات. الخيار الأول إذا كنت تستخدم XP أو أحدث، لاستخدام COM-التسجيل مجاني مع ملف البيان كما هو موضح على <لأ href = "http://msdn.microsoft.com/en-us/library/fh1h056h.aspx "يختلط =" noreferrer نوفولو "> MSDN . والفكرة هي أن يعلن بك مكونات (اكتف) COM في ملف البيان بدلا من التسجيل. وذلك لMyApp.exe، إنشاء MyApp.exe.manifest بما يلي (باستخدام اسم ملف DLL الخاص بك وCLSID):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity type="win32" name="MyApp_ActiveX" version="1.0.0.1" 
        processorArchitecture="x86" publicKeyToken="0000000000000000" />

  <file name="MyActiveX.dll">
    <comClass clsid="{0000000-0000-0000-0000-000000000000}" threadingModel="Both" />
  </file>
</assembly>

والخيار الآخر كما DougN ذكر هو أن يلف CoCreateInstance الخاص بك () لإنشاء الكائن. وC ++ التالية (بالإضافة إلى ATL) رمز ينبغي أن نفعل ذلك (الانتقال من الذاكرة حتى مزدوجة التحقق من رمز):

typedef int (__stdcall *LPDLLGETCLASSOBJECT)(REFCLSID, REFIID, void**);

// LoadInterface() - Load COM Interface from DLL without using registry.
//
// USAGE:   
//   HMODULE hModule = 0;
//   CComPtr<IMyActiveX> pActiveX;
//   if(SUCCEEDED(LoadInterface("C:\\Debug\\MyActiveX.dll", CLSID_MyActiveX, IID_IMyActiveX, (void**)&pActiveX, &hModule)))
//   {
//      // TODO: use pActiveX
// 
//      // caller must call FreeLibrary(hModule) when done
//      pActiveX = 0;
//      FreeLibrary(hModule); 
//   }
//
HRESULT LoadInterface(LPCTSTR pDllPath, REFCLSID rClsid, REFIID riid, LPVOID* ppv, HMODULE *pModule)
{
    if(pModule == 0 || ppv == 0) return E_POINTER;
    HMODULE hModule = LoadLibrary(pDllPath);
    if(hModule == 0) return E_FAIL;

    HREUSLT hr = E_POINTER;
    CComPtr<IClassFactory> classFactory;
    LPDLLGETCLASSOBJECT pGetClassObject = (LPDLLGETCLASSOBJECT)GetProcAddress(hModule, "DllGetClassObject");
    if(pGetClassObject)
    {
        hr = pGetClassObject(rClsid, IID_IClassFactory, (void**)&classFactory);
        if(SUCCEEDED(hr))
        {
            hr = classFactory->CreateInstance(0, riid, (void**)ppv);
            if(SUCCEEDED(hr))
            {
                *pModule = hModule;
                return S_OK;
            }
        }
    }

    // unload library on error
    if(hModule)  
    {
        FreeLibrary(hModule);
    }
    return hr;
 }

نصائح أخرى

لا يوجد ما يمكنني التفكير فيه. هذا هو المنطق كله وراء COM (وبالتالي اكتف).

إذا يمكنك التحكم في التعليمات البرمجية التي يقوم بتحميل عنصر تحكم ActiveX، ولا أحد آخر يحتاج إلى تحميله، هل يمكن القفز على التسجيل ويدويا التعامل مع المكالمات CreateInstance الخاص بك: فشل LoadLibrary، الحصول على مؤشر إلى كائن مصنع، وإنشاء مثيلات مباشرة.

هل أن على المشروع منذ حوالي 10 عاما وعملت كبيرة.

ولكن، إذا كنت لا تستطيع أن تفعل ذلك (وربما كنت لا تسيطر رمز الدعوة CreateInstance)، ثم عادل إنشاء ملفين دفعة ووضعها على سطح المكتب: واحد لتسجيل التصحيح، واحدة لتسجيل دلس الإصدار . الانتقال ذهابا وإيابا ثم يصبح من السهل جدا.

ويمكنك نسخة عناصر تحكم ActiveX باستخدام معرف البرنامج .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top