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 内の出力関数名は分割されません。
手順 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 によって提供される
DumpBin.exe - VC5.0 によって提供
Lib.exe - VC5.0 によって提供
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
最後に進む
:エラー
echo 使用法: MkLib DllName
echo 注: パラメータ「DllName」に拡張子「.dll」を追加しないでください。
:終わり