関数型?の呼出部分がコンパイルエラーになる

解決


ぺんたごん  2011-08-15 07:40:50  No: 40838

こんばんわ

VB6/VB.NET/C#/Prismなど.NET系はバリバリやってますが
ネイティブDelphiは始めて間もないです。2009を使っています。

今回、あるクラス内でDLLを動的にロードする処理を組んでいます。
しかし、正しい(と思っている)コードがコンパイルエラーになるのですが
エラーの意味が全く理解できません。

:詳細:

問題の箇所の定義が
A = class
  strict private
    get_DLLFunc: String;
    type
      TDLLFunc = function: PChar; stdcall;
  //中略
  public
    property DLLFunc: String read get_DLLFunc;
end;

という定義となっています(DLLロード部分は省きます)
そこで、実装部でロード済みの関数を呼び出そうと

function A.DLLFunc: String;
begin
  Result := String(TDLLFunc);
end;

とすると、

[DCC エラー] LS.PiConv.PluginBase.pas(89): E2029 '(' が必要な場所に ')' があります
[DCC エラー] LS.PiConv.PluginBase.pas(90): E2029 ')' が必要な場所に 'END' があります

の2つが発生します。
では…と思い

function A.DLLFunc: String;
begin
  Result := String(TDLLFunc());
end;

とすると、

[DCC エラー] LS.PiConv.PluginBase.pas(89): E2029 式 が必要な場所に ')' があります

となります…
まさかと思い

function A.DLLFunc: String;
begin
  Result := String(TDLLFunc(nil));
end;

とかするとコンパイルエラーは消えました。
この状態で実行したらどうなるか、まではまだ検証できていませんが
もうなにがどうしてこうなっているのか全く理解の範疇を超えています。

どなたか解説をお願いいたします…


ぺんたごん  2011-08-15 07:41:42  No: 40839

あごめんなさい、エラーメッセージのファイル名は
正式版のが出ちゃってますね。気にしないでください…


ぺんたごん  2011-08-15 07:44:31  No: 40840

あーなんかgdgdですね

宣言部の get_DLLFunc は function が抜けてます。

あと実装部の A.DLLFunc は get_ が抜けてますね…

すみません(書き込み前の確認ページが出ると嬉しいな…w)


ぺんたごん  2011-08-15 07:52:48  No: 40841

あーーーごめんなさいごめんなさい

型を直接使えるわけないやん!

var
  FDLLFunc: TDLLFunc;

これやって FDLLFuncを呼ばなあかんかったですね!!
完全にボケてました…頭冷やします

スレ荒らしてすみませんでしたorz


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

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






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