| 
2014/9/9 (火) 00:14:00  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 の実行結果です. 
    |   
 |