|
SetEvent, WaitForMultipleObjects 관련해서 질문 드립니다.
현재 세개의 부분으로 나누어져 있는데요.
1. Lib 프로젝트
* 헤더파일
extern HANDLE *HandleRingEvent;
void __stdcall LCreateHandle(void);
void __stdcall LCloseHandle(void);
int __stdcall WaitRingEvent(int Channel);
int __stdcall SetRingEvent(int Channel);
* CPP 파일
int TotalChannels = 120;
HANDLE *HandleRingEvent;
void __stdcall LCreateHandle(void)
{
int i;
HandleRingEvent = new HANDLE[TotalChannels];
for(i = 0; i < TotalChannels; i++){
HandleRingEvent[i] = CreateEvent(NULL, FALSE, FALSE, NULL);
}
}
void __stdcall LCloseHandle(void)
{
int i;
for(i=0;i<TotalChannels;i++){
CloseHandle(HandleRingEvent[i]);
}
delete []HandleRingEvent;
}
int __stdcall WaitRingEvent(int Channel)
{
HANDLE hEvents[] = { HandleRingEvent[Channel]};
DWORD Ret;
Ret = WaitForMultipleObjects(1, hEvents, FALSE, INFINITE);
return Ret;
}
int __stdcall SetRingEvent(int Channel)
{
SetEvent(HandleRingEvent[Channel]);
}
2. DLL 파일
extern "C" __declspec(dllexport) int __stdcall DllFunc1(void)
{
WaitRingEvent(1);
}
3. 테스트 실행파일
1. DLL 로딩.
DllInstance = LoadLibrary("Dll.dll");
CreateChild = (int(__stdcall *)(void))GetProcAddress(DllInstance, "DllFunc1");
2. Lib 의 LCreateHandle(void) 호출.
3. 첫번째 쓰레드에서 다음 실행.
Form1->Memo1->Lines->Add("Waiting....");
WaitRingEvent(1);
Form1->Memo1->Lines->Add("Event arrived.");
-. 정상으로 이벤트 수신후 메시지 출력되네요.
4. 두번째 쓰레드에서 다음 실행
Form1->Memo1->Lines->Add("Waiting....");
Form1->CreateChild(); // DLL 함수 호출.. DLL 안에서는 WaitRingEvent(1); 으로 이벤트 대기
Form1->Memo1->Lines->Add("Event arrived.");
% 여기서 이벤트 대기가 되지 않네요. IDE 에서 실행하면
HANDLE hEvents[] = { HandleRingEvent[Channel]}; <--- 이부분에서 에러가 나고요.
하나의 라이브러리에 있는 핸들(광역변수)을 사용하여 메인 프로그램에서 핸들을 생성하고, DLL 에서 이 핸들에 따른 이벤트
대기를, 나중에 메인프로그램에서 핸들 해제를 하고자 합니다.
메인 프로그램에서의 이벤트 대기는 잘 되는데, 왜 DLL 안에서는 안되는 것일까요?
고수님들의 도움 부탁드립니다.
요 부분때문에 프로젝트 개발이 중단된 상태네요. 요거이 안되면 그림을 다시 그려야하는 상황.ㅠ.ㅠ
꼭 도와주세용.~
감사합니다.
|