2013-02-27 14 views
0

VCL 데이터 모듈이 포함 된 dll을 만들려고합니다. 다양한 응용 프로그램이 모두 동일한 dll을로드하고 동일한 데이터베이스 코드를 사용할 수 있다는 생각입니다.C++ Builder XE2 : dll에서 데이터 모듈 초기화

데이터 모듈 자체가 응용 프로그램의 일부로 확인되었습니다. - 양식을 내 dll 프로젝트로 복사했습니다. 나는 또한 내가 형태하지만 아무튼를 작성하기 전에 초기화> 응용 프로그램 - 전화를해야하는지에 대해 뭔가를 본 적이

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) 
{ 
    //if I don't call this, I get an exception on initializing the data module 
    CoInitialize(NULL); 

    //initialize a standard VCL form; seems to works fine 
    //I'm not using Application->CreateForm as I don't want the form to appear straight away 
    if(!MyForm) MyForm = new TMyForm(Application); 

    //this doesn't work - the thread seems to hang in the TDataModule base constructor? 
    //I've also tried Application->CreateForm; same result 
    if(!MyDataModule) MyDataModule = new TMyDataModule(Application); 

} 

:

그래서 DLL 진입 점 방식에서, 나는 데이터 모듈을 초기화 할 필요가 어떤 변화도없는 것 같습니다.

아이디어가 있으십니까?

감사

+0

이것은 관련이 있거나 다를 수 있습니다. 빈 데이터 모듈을 초기화 할 수 있습니다. 내 실제 데이터 모듈에는 ADOConnection 및 ADOQuery가 포함되어 있습니다. 문제가 발생하면이 문제를 시작하자마자 – user1898153

+0

스레드에서 ADO 구성 요소를 사용할 때 비슷한 문제가있었습니다. CoInitialize를 호출해야했습니다. 귀하의 경우 도움이 될지 모르지만 시도하십시오 .. – Tracer

답변

0

당신은 정말 전혀 DllEntryPoint() 매우 많은 일을 할 수 없습니다. 어쨌든 CoInitialize()을 호출하지 않습니다. 로드 될 때 DLL을 호출하는 것은 DLL의 책임이 아닙니다. DLL을로드하기 전에 호출하는 응용 프로그램의 책임입니다.

당신은해야 하나 :

  1. 수출 당신의 DLL을 초기화 한 후

  2. 돈을 (언로드하기 전에 DLL을 uninitialing에 대한 동일) DLL을로드 한 후 응용 프로그램을 가지고 추가 기능 ' DLL이 실제로 필요할 때까지 TForm/TDataModule을 생성하십시오.

  3. TForm/TDataModule을 DLL 내부의 자체 작업자 스레드로 이동하십시오. 이 경우 CoIniitalize()으로 전화하십시오.

그리고 모든 경우에

, 당신의 TForm을 /에 TDataModule의 수명을 관리하는 DLL의 Application 개체를 중계하지 않습니다. DLL을 언로드하기 전에 직접 해지하십시오.