2012-12-04 3 views
1

2 개의 COM DLL을 참조하는 응용 프로그램이 있습니다. 시작시 응용 프로그램이 호출하는 Init 함수가 2 DLL에 있습니다.다중 DLL 관련 문제

두 DLL은 서로 비슷하지만 서로 다른 uid 및 다른 인터페이스 이름을 가지고 있습니다. 그것과는 별개로 논리는 동일하고 ... 사용 된 변수도 동일합니다.

이 시스템이 작동하는 방법입니다 - 1의 startApp()을 .. 여기에 응용 프로그램이 var에 X를 설정 2. 초기화 DLL1 (appVar1, appVar2은), y는 응용 프로그램에서 전달되는 값이 DLL에 정의. x = appVar1 및 y = appVar2라고합시다. x와 y는 전역 변수입니다. 3. Init DLL2 (appVar1a, appVar2a) ... 앱은 DLL2에 정의 된 var x를 앱에서 전달 된 값으로 설정합니다. x = appVar1a; y = appVar2.

이제 DLL1에서 뭔가를 실행하려고하면 x와 y의 값이 신비하게 다른 것으로 변경되었습니다.

x는 이제 appVar2가되고 y는 비어 있습니다.

여기서 x, y 및 appDar1과 같은 모든 변수는 InitDLL 함수에서 앱이 전달한 것으로 BSTR입니다.

코드 x, y가 initDLL1에서 appVar1, appVar2로 올바르게 설정되었습니다. 그러나이 함수가 반환되고 두 번째 DLL (InitDLL2)을 초기화하면 변경됩니다.

흥미롭게도 DLL2에서 이러한 문제가 발생하지 않습니다. 비록 코드/로직이 매우 유사하지만 ... 호출하는 인터페이스는 예외입니다.

DLL1과 DLL2 모두 InitDLL 함수에서 x와 y를 다양한 함수로 사용하는 새 스레드를 만듭니다. 위의 문제로 인해 DLL1은 항상 실패합니다 .DLL2에는 문제가 없습니다.

무엇이 잘못 될 수 있는지에 대한 단서가 있습니까?

+0

(발신자와 수신자가 모두 수신 됨) 코드를 표시하십시오. =을 BSTRs에 할당 할 수 없으므로 복사해야합니다. –

답변

0

BSTR을 할당 할 수는 없으므로 복사해야합니다. 여기에 문제가 있습니다 :

// caller - by COM memory management rules, for [in] parameters 
// caller needs to allocate and free the memory 
BSTR str = SysAllocString("..."); // string is allocated 
comObjectPtr->Init(str);   // in the function, pointer is copied to global 
SysFreeString(str);    // string released, pointer points to garbage 

// callee 
ComObject::Init(BSTR str) 
{ 
    // wrong code!!! you have no idea about lifetime of str, 
    // so you can't just assign it. When the caller function 
    // exits, string memory is released and your global is thrashed 
    // I suspect you use some BSTR wrapper (bstr_t or CComBSTR) so 
    // you don't see the deallocation part and that's why the values 
    // are invalidated on function exit: the destructor of BSTR wrapper 
    // does its job 
    global_str = str;    

    // correct code: 
    // global_str = SysAllocString(str); 
}