- お知らせ -
  • 当wikiのプログラムコードの表示を直してみました(ついでに長い行があると全体が下にぶっ飛ぶのも修正)。不具合があればBBSまでご連絡下さい。

はじめに Edit

可変長引数(ヘルプだと、可変個のパラメータとなっている)について。
基本的に、varargsを使う。

(ちなみに、なぜか、ヘルプを「可変個」で検索しても出てこない罠)

関数呼び出しをしてみる Edit

WindowsAPI(DLL)の可変長引数の関数を呼び出してみる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
program wsprintf_test;
{$APPTYPE CONSOLE}
uses SysUtils;

function wsprintf(var Output ; Format: PChar): Integer;
  cdecl; varargs; external 'user32' name 'wsprintfA';
procedure Main();
var s:string;
begin
  SetLength(s,1000);
  wsprintf(pchar(s)^,'%5d %5d', 1,100);
  s := PChar(s);
  Writeln(s);

  Readln;
end;
begin
  Main;
end.

結果

    1   100

※これは、あくまで、例です。wsprintfは、バッファーオーバーフローの危険性があるので実際には使わないこと。

可変長引数の関数を定義し呼び出してみる Edit

Delphi内で定義して、Delphi内で呼び出してみるテスト。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
program call_test;

{$APPTYPE CONSOLE}
uses SysUtils;
type
  TPuts = procedure (par1{, ...}: string); cdecl varargs;

procedure Puts(par1, par2, par3: string); cdecl;
begin
  Write(par1, ' ');
  Write(par2, ' ');
  Write(par3, ' ');
  Writeln('');
end;
begin
  TPuts(@Puts)('Hello', 'World', 'HogeMoge');
  Readln;
end.

可変長の引数に対応させるにはどうすればいいんだろ。
→DLLとかでCの可変長引数に対応させるには、P4D(Python4Delphi)のコードが参考になるかも




Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New Pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2009-07-09 Thu 13:18:11 JST (3693d)