4

Lazarus / delphiでメンバー関数のポインタを取得する方法はありますか? 私はコンパイルできないこのコードを持っています....

エラーはDelphiにあります:
variable required

Lazarusにあります:
Error: Incompatible types: got "<procedure variable type of function(Byte):LongInt of object;StdCall>" expected "Pointer"


コード:

  TClassA = class
  public
      function ImportantFunc(AParameter: byte): integer; stdcall;
  end;

  TClassB = class
  public
     ObjectA: TClassA;
     ImportantPtr: pointer;
     procedure WorkerFunc;
  end;

  function TClassA.ImportantFunc(AParameter: byte): integer; stdcall;
  begin
     // some important stuff
  end;

  procedure TClassB.WorkerFunc;
  begin
     ImportantPtr := @ObjectA.ImportantFunc; //  <-- ERROR HERE
  end;

ありがとう!

4

3 に答える 3

4

メンバー関数を単一のポインターで表すことはできません。インスタンス用とコード用の2つのポインターが必要です。ただし、これは実装の詳細であり、メソッドタイプを使用する必要があります。

type
  TImportantFunc = function(AParameter: byte): integer of object; stdcall;

次に、このタイプの変数にImportantFuncを割り当てることができます。

stdcallを使用しているので、これをWindowsコールバックとして使用しようとしていると思われます。これは、メンバー関数では不可能です。グローバルスコープの関数、または静的関数が必要です。

于 2012-05-05T08:39:04.553 に答える
2
type
  TImportantFunc = function(AParameter: byte): integer of object;stdcall;

  ImportantPtr: TImportantFunc;

procedure TClassB.WorkerFunc;
begin
   ImportantPtr := ObjectA.ImportantFunc; //  <-- OK HERE
end;
于 2012-05-05T08:45:45.297 に答える
1

ObjectA.ImportantFuncはメモリの場所ではないため、アドレス演算子@を適用できません。したがって、コンパイラ エラーです。@TClassA.ImportantFunc(メソッドコード) とObjectA(自己引数)の 2 つのポインターです。質問に対する答えは、本当に必要なもの (コード ポインター、自己、両方、またはなし) によって異なります。


関数名のスコープだけが必要な場合は、静的クラス メソッドを使用します

TClassA = class
public
 class function ImportantFunc(Instance: TClassA; AParameter: byte): integer;
                                                               stdcall; static;
end;
于 2012-05-05T09:24:13.517 に答える