名前 題名 ▼ Mr.XRAYさん > とある場所で,cdecl というのを見かけましたので.ちょっと. > この cdecl は関数の呼出規約の 1 つです. > 今回は DLL 内の関数の呼出しとなっています. > > http://ja.wikipedia.org/wiki/%E5%91%BC%E5%87%BA%E8%A6%8F%E7%B4%84 > > C または C++ で作成した Linux 用の共有ライブラリを, > Kylix(カイリックス- 死語?), FreePascal で使用する際, > 多くの場合,stdcall ではなく cdecl を使用します. > Linux の共有ライブラリの拡張子は so です.libXXXX.so.XXXX の形式です. > > DLL 内の関数を cdecl 呼出規約で定義した場合, > DLL 内の関数を使用する側のプログラムも,当然 cdecl 呼出規約で > 関数を定義します. > > Windows の共有ライブラリ DLL では,上のリンクの記事のように, > stdcall を使用した方が無難です. > stdcall は Pascal の呼出規約と同じと考えて差し支えないと思います. > Windows では stdcall が事実上のデファクトスタンダードの呼出規約です. > > > 呼出規約を cdecl にした場合のサンプルです. > 基本的に,以下の記事のように,DLL 内の関数を使用するのに, > DLL を作成した言語は直接の関係はありません. > あるのは,作成した関数の引数の型や戻り値の扱い方等です. > > 現に,少し前に PDF の作成用の DLL を Visual Studio 2013 Express > で作成しています. > > http://mrxray.on.coocan.jp/Delphi/Others/Usage_Win32API.htm > > > cdecl 呼出規約のDLL内の関数の使用例 > > implementation > > {$R *.dfm} > > type > TQueryStatus = function(ID: Integer; var ResID: Integer): PWideChar; cdecl; > > //----------------------------------------------------------------------------- > // DLL内のcdecl呼出規約の関数の使用例 > // > // Windows 7 U64(SP1) + Delphi XE(UP1) Pro > // DLLはWindows 2000 + Delphi 6で作成したもの > // > // 2014年09月08日 Mr.XRAY > //----------------------------------------------------------------------------- > procedure TForm1.Button1Click(Sender: TObject); > var > DLLPath : String; > DLLHandle : Cardinal; > QueryStatus : TQueryStatus; > ID : Integer; > ResID : Integer; > Description : WideString; > begin > DLLPath := 'cdecl_Test.dll'; > DLLHandle := LoadLibrary(PChar(DLLPath)); > > if DLLHandle <> 0 then begin > try > @QueryStatus := GetProcAddress(DLLHandle, 'QueryStatus'); > if @QueryStatus <> nil then begin > ID := 20; > Description := QueryStatus(ID, ResID); > ShowMessage(Description + ' ' + IntToStr(ResID)); > end; > finally > FreeLibrary(DLLHandle); > end; > end; > end; > > > 使用した DLL のコード > DLL は Windows 2000 + Delphi 6 で作成 > > > library cdecl_Test; > > uses > SysUtils, > Classes; > > function QueryStatus(AID: Integer; var ResID: Integer): PWideChar; cdecl; > var > FID : Integer; > StrText : WideString; > begin > FID := AID; > StrText := 'テストDLL関数'; > > Result := PWideChar(StrText); > ResID := FID * 50; > end; > > exports > QueryStatus; > > begin > end. > > プロジェクトのダウンロード (EXE 付き) > http://mrxray.on.coocan.jp/Delphi/zip/cdecl_dll_functionCall.zip > > 下図は,添付の EXE の実行結果です. GIF,JPEG,PNG画像ファイル及びLZH,ZIPファイルをアップロードできます.600 x 1200 ピクセルを超える画像は縮小表示されます(画像クリックで拡大表示). (上限122000(120k)バイト) 削除キー Link