2013-10-16 1 views
0

C++ Builder 6에서 생성 된 데이터 모듈이 몇 개 있습니다. 각 모듈은 데이터베이스와의 연결을 초기화하는 다른 데이터 모듈을 사용합니다. 그 datamodules 밖으로 DLL을 만들려고 해요.DLL을 통해 ADO 객체 생성시 비정상적인 프로그램 종료가 발생합니다.

DataModule_Users 생성시 오류가 발생하고 '비정상적인 프로그램 종료'라고 표시됩니다.

어디서 잘못 되었나요? 사전에

감사

USEFORM("DataModule_Connection.cpp", DataModule_Connection); /* TDataModule: File Type */ 
USEFORM("DataModule_Users.cpp", DataModule_Users); /*TDataModule: File Type */ 
//------------------------------------------------------------------ 
This file is used by the project manager only and should be treated like the project file 

DllEntryPoint 

datamodule_dll.bpf datamodule_DLL.cpp

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) 
{ 
    return 1; 
} 
extern "C" __declspec(dllexport) const char * GetUserName(const char * ID); 

const char * GetUserName(const char * ID) { 
    CoInitialize(NULL); // datasets use COM 
    // This is used by DataModule_Users (normally this is done with Application->CreateForm(); 
    DataModule_Connection = new DataModule_Connection(0 /* Owner */); 
    DataModule_Users = new DataModule_Users(0 /* Owner */); 
    return DataModule_Users->GetUserName(ID); 
} 
+1

왜 코드가 충돌하는지 확인하기 위해 디버깅을 시도 했습니까? 또한 GetUserName()이 호출 될 때마다 새 DataModule 객체를 만들지 만 해제하지는 않습니다. 그리고 당신은 CoInitialize()를 호출해서는 안됩니다. 완전히 잘못된 일이거나 잘못된 모델을 사용하는 호출자에 대한 COM 아파트 모델을 설정하고 있습니다. DLL 내부의 COM 아파트 모델을 실제로 제어해야하는 경우 DataModule을 자체 작업자로 이동해야합니다 실. –

+0

CoInitialize를 제거하면 'CoInitialize가 호출되지 않았습니다.'오류가 발생합니다. DllEntryPoint()에서 datamodules를 만들고 싶었지만 오류도 있습니다. 그래서 저는 그것들을 if 구조로 싸서 단 한 번만 만들었습니다. – Gudgip

+0

COM은 스레드별로 초기화됩니다. 스레드의 COM 모델 (아파트 대 멀티 스레드)이 설정되면 나중에 변경할 수 없습니다. 호출자가하기 전에 DLL에서 CoInitialize()를 호출하면 매개 변수가 우선 순위를 갖게되어 호출자의 요구를 충족하지 못할 수 있습니다. 호출자에게 영향을주지 않으면 서 DM의 COM 설정을 제어하려면 DM을 자신의 스레드로 이동해야합니다. 게다가, DllEntryPoint()는 어쨌든 그들을 초기화하는 적절한 장소가 아닙니다. OS는 DllEntryPoint()가 수행 할 수있는 작업을 제한합니다. –

답변

0

나는 레미 Lebeau을 인용합니다 :

COM은 스레드별로 초기화됩니다. 스레드의 COM 모델 (아파트 대 멀티 스레드)이 설정되면 나중에 변경할 수 없습니다. 호출자가하기 전에 DLL에서 CoInitialize()를 호출하면 매개 변수가 우선 순위를 가지므로 호출자의 요구 사항을 충족하지 못할 수 있습니다. 이없는 호출자에게 영향을주는 DM에 대한 COM 설정을 제어하려는 경우 DM을 자체 스레드로 이동해야합니다. 게다가 DllEntryPoint()는 어쨌든 을 초기화하는 데 적절한 위치가 아닙니다. OS는 DllEntryPoint()가 수행 할 수있는 작업을 제한합니다.

이 문제가 해결되었습니다. 라이브러리를로드하기 전에 coInitialize()를 호출해야했습니다.