Delphi는 VC의 DLL을 호출합니다.
Extern “C” void __declspec(dllexport) __stdcall ShowMess(HWND hwnd, char* mess);
출력 형식은 _ShowMess@8입니다. "8"은 함수 매개변수의 바이트 수입니다.
이름 분할을 방지하려면 다음 방법을 사용하여 문제를 해결할 수 있습니다.
1. 명령문에 __stdcall을 추가하지 말고 VC 기본 형식인 __cdecl을 사용하십시오. 그러나 Delphi에서는 호출 형식이 cdecl임을 표시해야 합니다.
2. VC 프로젝트에 다음과 같은 def 파일을 추가합니다.
도서관
수출
쇼메스@1
그러면 DLL의 출력 함수 이름이 분할되지 않습니다.
PROcedure ShowMess(h:HWND; mess:PChar); Stdcall;{Cdecl;} 외부 LibName;
Stdcall 또는 Cdecl 문이 없는 경우 Delphi는 기본적으로 Register(FastCall) 호출 형식을 사용합니다.
#프라그마 팩(4)
//구조 정의
#프라그마 팩()
TDump.exe - Delphi 4 및 C++ Builder 3에서 제공
Impdef.exe 및 Implib.exe - C++ Builder 3에서 제공
VC5.0에서 제공하는 DumpBin.exe
VC5.0에서 제공하는 Lib.exe
VC가 Delphi의 DLL을 호출합니다.
함수 ShowDialog( hMainWnd:THandle; Msg:PChar ):integer;
Dll 파일로 출력할 때 이름이 분할되지 않습니다.
extern "C" __declspec(dllimport) int __stdcall ShowDialog( HWND hwnd,char* Msg );
. __stdcall이 포함된 경우 Lib 파일의 해당 함수 이름을 분할해야 합니다. 다음 단계를 사용하여 Lib 파일을 생성할 수 있습니다.
. Impdef.exe를 사용하여 다음 형식의 def 파일을 생성합니다. Impdef def 파일 이름 dll 파일 이름
. ShowDialog를 ShowDialog@8로 변경하는 등 def 파일 매개변수를 수동으로 조정합니다.
. Lib.exe를 사용하여 Lib /def:def 파일 이름 형식으로 lib 파일을 생성합니다.
. 명령문에 __stdcall이 없는 경우 기본 호출 형식은 여전히 stdcall이지만 이름 분할은 필요하지 않습니다. 다음 배치 파일 MkLib.bat를 사용하여 Lib 파일을 생성합니다.
@에코 꺼짐
%1.==인 경우 오류가 발생합니다.
impdef %1.def %1.dll
lib /def:%1.def
끝으로 가다
:오류
에코 사용법: MkLib DllName
echo 참고: "DllName" 매개변수에 ".dll" 확장자를 추가하지 마세요.
:끝