DLL 関数に 3 つのポインターを渡そうとしています。私は持っている:
{
$コード=1;
$len=100;
$str=" " x $len;
$function = new Win32::API(DLLNAME,'dllfunction','PPP','V');
$function->Call($code,$str,$len);
}
DLL は次のように定義されます。DLL はvoid dllfunction(int* a, char* str, int* len);、3 つのポインターが指すすべての変数を変更します。
ただし、これを実行するとセグメンテーション違反が発生します。Win32::APIのドキュメントでは、Perl 変数参照の代わりに実際の変数名を使用する必要があると指定されています。私が欠けているものを誰か教えてもらえますか?ありがとう。
*詳しくは:
printf()3 つのポインターのアドレスを出力するために DLLを追加しprintf、3 つの変数の参照を出力するために Perl を追加しました。そして、私は次のようになります
DLL : コード = 0x10107458 エラー = 0x10046b50 str = 0x10107460
Perl : コード = 0x101311b8 エラー = 0x101312a8 str = 0x10131230
DLL が間違ったアドレスを取得している理由がわかりましたか?
****詳しくは
多くのデバッグの後、DLL 関数から戻るときにこれが発生していることがわかりました。printf("done\n"); を追加しました。このDLL関数の最後の行として、これが出力され、プログラムがsegfaultします。Win32::API で起こっていると思いますか? 誰もこれを経験しましたか?
また、DLL から 3 つの変数すべての初期変数にアクセスできます。そのため、ポインタは正しく渡されますが、何らかの理由で DLL から戻るときに segfault が発生します。新しいデータを Perl 変数にコピーしようとするとセグメンテーション違反になるのでしょうか?