2011-09-05 5 views
1

내가이 프로토 타입을 갖는 기능을 포함하는 MFC DLL을 개발하여 DLL 내 보낸 된 함수에서 CStringArray 및 매개 변수를 해제 할 때 :힙 위반

//DLL code 
long __declspec(dllexport) GetData(CString csIdentifier, CStringArray& arrOfData) 
{ 
    //based on the identifier I must add some strings inside the string array 
    arrOfData.Add("..."); 
    arrOfData.Add("..."); 
    /*.....................*/ 
    return 1; 
} 

내가 실행에서 (함수가 호출되는 후이 문제). arrData의 소멸자가 호출되어 메모리를 해제하려고 시도하지만 arrOfData의 할당이 다른 힙 (dll 내부)에서 수행 되었기 때문에 성공하지 못합니다. 동일한 환경 설정을 사용하여 두 응용 프로그램 (Exe 및 Dll)을 모두 컴파일했지만 디버그 및 릴리스 모드 모두에서 여전히 문제가 있습니다. 문제를 어떻게 해결할 수 있습니까?

//Executable code 
{ 
    CStringArray arrData; 
    GetData("Identifier",arrData); 
    //data is accesible 
} 

힙 위반 그냥 EXE/DLL의 경계를 넘어 CStringArray 같은 MFC 객체를 공유하기 위해 코드 블록

답변

1

기존 전에, 당신은 DLL이 MFC 확장 DLL이 될 수 있도록해야합니다 발생합니다. 참조 : https://msdn.microsoft.com/en-us/library/h5f7ck28(v=vs.140).aspx

를 메모리 관리 섹션에서 :

MFCx0.dll 및 클라이언트 응용 프로그램의 주소 공간에로드 된 모든 확장 DLL의 경우와 같은 메모리 할당, 리소스 로딩 및 다른 MFC 글로벌 상태를 사용 그들은 동일한 적용에있었습니다. 비 -MFC DLL 라이브러리와 일반 DLL이 정반대로 수행되고 각 DLL이 자체 메모리 풀에서 할당되기 때문에 이것은 중요합니다.

그것은 당신의 DLL 함수가 AFX_MANAGE_STATE (AfxGetStaticModuleState()) 외부에서 호출 할 때 환경을 설정 속성에 상단에 필요로하는 것도 가능합니다.

+0

구성을 MFC 확장으로 변경하면 작업이 수행됩니다. 한 가지 더 변경해야 할 것은 함수의 선언을 다음과 같이 변경해야한다는 것입니다. – Dan

+0

구성을 MFC 확장으로 변경하면 작업이 수행됩니다. 필자가 변경해야했던 한 가지 점은 내 보낸 함수의 선언을 long __declspec (dllexport)에서 : extern "C"__declspec (dllexport)로 길게 실행 가능 부분에서 링크 오류를 해결하는 것입니다. 또한 AFX_MANAGE_STATE (AfxGetStaticModuleState())가 dll 코드에서 제거되었습니다. – Dan