문제

응용 프로그램 저는 최근에 작업을 시작하는 등록해 두 dll,"기 때문에 ActiveX".

이것은 어려운 여러 응용 프로그램의 버전에 존재하는 기계를 말한 제품 설치 버전과,디버그 및 릴리스 버전의 최신 개발 sources.

대안은 무엇인을 등록에 대한 ActiveX.

도움이 되었습니까?

해결책

응용 프로그램에 ActiveX 객체를로드하면 몇 가지 옵션이 있습니다. 첫 번째 옵션 XP를 사용하거나 최신 인 경우에 설명 된대로 매니페스트 파일이있는 등록이없는 COM을 사용하는 경우 MSDN. 아이디어는 COM (ActiveX) 구성 요소를 레지스트리 대신 매니페스트 파일로 선언하는 것입니다. 따라서 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)의 배후의 전체 근거입니다.

을 제어하는 경우에는 코드는 실 ActiveX 컨트롤 및 아무도 필요하드,를 생략할 수 있 등록 및 수동으로 처리하는 자신의 CreateInstance 전화:LoadLibrary,포인터를 얻을 공 개체를 인스턴스를 만들이 직접 있습니다.

았는 프로젝트에 대해 10 년 동안 전했다.

그러나,당신이 할 수 없는(아마도 당신이 통제하지 않는 코드를 호출하 CreateInstance),단지 두 개를 만들 배치 파일에 넣어 데스크톱:하나 등록하는 디버깅,그리고 중 하나를 등록하 릴리스 DLLs.앞뒤로 전환한 다음 매우 쉽게 된다.

ActiveX 컨트롤을 사용하여 버전을 버전 할 수 있습니다 progid.

.bat 솔루션이 반드시 끔찍하다고 생각하지 않습니다. 대부분의 간단한 ActiveX 컨트롤은 자체 등록/등록입니다. 그러나 여전히 동시에 디버그 버전이나 릴리스 버전을 실행하도록 제한합니다.

그것은 큰 문제 ( "dll hell"의 본질)이며 .NET와 Java의 인기의 이유 중 큰 부분입니다.

.NET은 Windows 2000 및 Windows 98 SE에 도입 된 기능인 나란히 공유를 활용한다고 생각합니다. 나는 당신이 그것을 사용하기 위해 .NET이 필요하다고 생각하지 않습니다 (당신은 당신이 com interop을하고 있다고 말하지 않았습니다).

MSDN AT에는 다소 긴 기사가 있습니다 http://msdn.microsoft.com/en-us/library/ms811700.aspx, "응용 프로그램에서 나란히 구성 요소 공유 구현". 나는 그것이 어떻게 작동하는지 완전히 명확하지 않지만 그것이 올바른 접근법이라고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top