ما هي البدائل لDLL تسجيل ل ActiveX
-
03-07-2019 - |
سؤال
وتطبيق لقد بدأت مؤخرا العمل على أن يسجل اثنين دلل "، وبسبب اكتف".
وهذا يجعل من الصعب الحصول على نسخة متعددة من الطلب الحالي على جهازك - يقول النسخة المنتج المثبت، والتصحيح وطرح إصدارات أحدث مصادر التنمية.
ما هي البدائل لتسجيل ل 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 باستخدام معرف البرنامج أ >.
وأنا لا أعتقد أن الحل الخفافيش أمر فظيع بالضرورة. معظم عناصر تحكم ActiveX بسيطة تقوم بالتسجيل الذاتي / إلغاء تسجيل. لكنه لا يزال يحد لك بتشغيل إما إصدار تصحيح أو الإصدار في وقت واحد، ليس على حد سواء في وقت واحد.
وانها مشكلة كبيرة (هو جوهر "DLL الجحيم")، وجزء كبير من السبب وراء شعبية. NET و Java.
وأعتقد صافي يستفيد من تقاسم جنبا إلى جنب، وهي ميزة عرض مع Windows 2000 و Windows 98 SE. أنا لا أعتقد أنك في حاجة .NET لاستخدامها (لم تقولون كنت تفعل COM إمكانية التشغيل المتداخل).
وهناك مقالة مطولة إلى حد ما على MSDN على http://msdn.microsoft كوم / EN-US / مكتبة / ms811700.aspx و "التنفيذية جنبا إلى جانب مكون مشاركة في تطبيقات" والتي تقترح إنشاء ملف .local. أنا لست واضحة تماما على كيف يعمل، ولكن أعتقد أن هذا هو النهج الصحيح.