DLL 可変長引数(varargs)について

解決


mook  2010-01-22 23:28:31  No: 37163

以下の内容につきまして教えてください。

function test(data: PChar): Integer; cdecl; varargs; external 'abcd.dll';

のようなDLL呼び出し部があるのですが、環境がDelphi5のため
varargs でエラーになってしまいます。

Delphi5で何か手を加えて利用する方法は無いでしょうか。

よろしくお願いします。


jazzin  2010-01-25 23:56:50  No: 37164

多少手間ですが、使いたい引数分の関数定義を書くことで利用できます。
Win32APIのwsprintfを例にすると、以下のようになります。

// 定義
function wsprintf(Output: PAnsiChar; Format: PAnsiChar; Num: Integer): Integer; cdecl varargs overload; external 'user32.dll' name 'wsprintfA';
function wsprintf(Output: PAnsiChar; Format: PAnsiChar; Num1, Num2: Integer): Integer; cdecl varargs overload; external 'user32.dll' name 'wsprintfA';

// 使い方
wsprintf(buf, '%04d', 1); // bufに'0001'が入る
wsprintf(buf, '%04d, %04d', 1, 123); // bufに'0001, 0123'が入る


jazzin  2010-01-25 23:58:02  No: 37165

すみません、varargsは余分でしたね^^;
正しい定義はこちらです。

function wsprintf(Output: PAnsiChar; Format: PAnsiChar; Num: Integer): Integer; cdecl overload; external 'user32.dll' name 'wsprintfA';
function wsprintf(Output: PAnsiChar; Format: PAnsiChar; Num1, Num2: Integer): Integer; cdecl overload; external 'user32.dll' name 'wsprintfA';


mook  2010-01-26 18:04:41  No: 37166

jazzin 様

ご回答ありがとうございます。

成る程、この方法ですね。
実はこの可変引数を使ったDLLは使わずに、別なやり方に
変更しました。

しかし、折角教えて頂いたので、時間見て試して見たいと思います。

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加