二つのDLLがあって、なぜか異なる名前ですが、関数の型がまったく同じという、
不思議な構成になっています。
一方の関数を呼び出すために以下の宣言を行いました。
THoge = function Hogehoge(aHoge1: Integer): Integer; stdcall;
もう一方も同じ型であるからと思って、以下のように書くとコンパイルエラーになります。
THogeNew = THoge; stdcall;
ですが、Stdcallを消すと、コンパイルは通ります。
ということは、Stdcallがなくても、暗黙で THoge 同様に StdCall規約になってしまうのでしょうか?
一応、LoadLibrary + GetProcAddress でアドレスを取得していますが、
挙動不審なので(これは、使い方が悪い可能性もある)、このあたりから
間違っているのかと思い質問してみました。
関数の名前と、関数型は関係ないですよ。
THoge = function Hogehoge(aHoge1: Integer): Integer; stdcall;
だとエラーになりませんか?
THoge = function(aHoge1: Integer): Integer; stdcall;
としないと、エラーになると思います。
異なる名前で同じ型であれば、THogeをそのまま利用できます。
あえて同じ型として定義したいのであれば、
THoge = function (aHoge1: Integer): Integer; stdcall;
THogeNew = THoge;
となります。
> ですが、Stdcallを消すと、コンパイルは通ります。
> ということは、Stdcallがなくても、暗黙で THoge 同様に StdCall規約になってしまうのでしょうか?
そういうことになります。
省略すると呼出規約はregisterになるため、
THoge = function (aHoge1: Integer): Integer;
THogeNew = THoge; stdcall;
というのもダメです。その場合は、
THoge = function (aHoge1: Integer): Integer;
THogeNew = function (aHoge1: Integer): Integer; stdcall;
と書けばよいかと思います。
にしのさん、レスありがとうございます。
> 省略すると呼出規約はregisterになるため、
なるほど、ここまで調べていませんでした。
(ヘルプもきっと読み飛ばしてしまったのか?)
THogeNew = THoge;
のように記述すると、THogeの呼出規約になってしまう。
呼び出し規約も含めた型のコピー(?)になるということですね。
呼び出し規約を変更したければ、以下のように同じ型で再度定義しなくてはいけないということですね。
> THoge = function (aHoge1: Integer): Integer;
> THogeNew = function (aHoge1: Integer): Integer; stdcall;
ありがとうございます。
勉強になりました。
> THoge = function Hogehoge(aHoge1: Integer): Integer; stdcall;
> だとエラーになりませんか?
これ、タイプミスです(^^ゞ
全部Hogeにこだわっているうちに・・・。
ツイート | ![]() |