|
BCB에서 Dll파일을 만들었습니다.
Project 옵션은 다음과 같습니다.
Advanced Compiler - Calling convention -> Standard call (check)
Advanced Compiler - Source -> MFC compatibility (check)
Linker -> USE dynamic RTL (uncheck)
다음은 사용함수중의 하나입니다.
int flag;
extern "C" __declspec (dllexport) void __stdcall OnTest();
void __stdcall OnTest()
{
flag = 1;
MessageBox(NULL, "OnTest()", "Test", MB_OK);
}
이렇게 만든 Dll파일과 Lib파일을 BCB에서 로드후 사용에는 아무런 문제가 없습니다.
그런데, VC++에서 사용시 lmplict 링크를 사용해서 (해당 Lib을 VC++의 Project-Link tab의 object/library modules에 설정) 컴파일하면, 링크에러가 납니다.
Linking...
LINK : fatal error LNK1168: cannot open Debug/VCSample.exe for writing
Error executing link.exe.
물론 VC++에서
extern "C" __declspec (dllimport) void __stdcall OnTest();
로 함수설정은 했습니다. 왜그럴까요???
그래서 이번에는 Explicit 링크를 사용해서 테스트하니, 함수는 실행이 됩니다.
그런데 Dll에 포함된 CodeGurad에서 에러가 레포팅됩니다.
------------------------------------------
Error 00001. 0x300010 (Thread 0x05E4):
Resource leak: The memory block (0x16F1CB8) was never freed
The memory block (0x016F1CB8) [size: 200 bytes] was allocated with SysGetMem
Call Tree:
0x00EAA4DF
0x00EAA3DD
0x00EAE1FC
0x00EAC6E1
0x0CD0A4C7(=CG32.DLL:0x07:CC48C2F)
0x00E96FC3
------------------------------------------
flag상수는 전역변수로 설정되어 있는데... 그것말고는 다른건 건드리는게 없습니다.
다른 함수나, 변수들은 많지만.. 일단 테스트할려고 전역변수 하나만 건드려 보았는데..
CodeGurad에서 에러가 레포팅된 후 다시 함수를 실행하면, "BORLNADMM.DLL has already allocated memory which may now be reported as false leaks" 에러가 발생합니다.
그래서 여쭤보는데요...
1. BCB에서 만들 Dll을 VC++에서 lmplict 링크로 사용시 왜 링크에러가 발생하는지...
2. Explicit 링크로 사용시 왜 메모리 에러가 발생하는지...
좀 가르쳐 주시기를 부탁드립니다.
|