- ベストアンサー
perlでWin32::APIを使用してDLLからバイナリデータを得たいのですが、
perlでWin32::APIを使用してDLLからバイナリデータを得たいのですが、 データ途中できれてしまいます。 0x00を含むところで切れているように思えます。 $datの長さを指定する方法とかあるのでしょうか? どうか助言をお願いします。 $func=new Win32::API("sample.dll","func1",[P,N,P],P); $size=0; $dat = $func ->Call("TEST",100,\$size); open(F,">kekka"); binmode(F); print F "$dat"; close(F);
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Win32::APIを使ってバイト配列のようなデータを取得する場合、 関数の戻り値として得るのではなく 引数に書き込む場所を与えておいて、そこに書き込むという形が ほとんどだと思うのですが、 なぜ質問の例にあるような手順を取っているのでしょうか? Win32::APIの本体を見ると、場所をかんちがいしていなければ case T_POINTER: ApiFunctionPointer = (ApiPointer *) ApiFunction; #ifdef WIN32_API_DEBUG printf("(XS)Win32::API::Call: Calling ApiFunctionPointer()\n"); #endif pReturn = ApiFunctionPointer(); #ifdef WIN32_API_DEBUG printf("(XS)Win32::API::Call: ApiFunctionPointer returned 0x%x '%s'\n", pReturn, pReturn); #endif /* #### only works with strings... #### */ cReturn = (char *) safemalloc(strlen(pReturn)); strcpy(cReturn, pReturn); ということをやっているので、 \x00 というデータがあったらそこで切れるのは 当然のように思います。 #Perlでの文字列自体は 、長さを別に管理しているので #データとして\x00を含めることはできます。
その他の回答 (1)
"$"だからじゃない? http://www.tohoho-web.com/wwwperl1.htm 「バイナリ読み込み」参照
補足
回答ありがとうございます。もう少し、perlを勉強します。
お礼
補足とお礼がごっちゃになってしまいました。 戻り値の型Pの場合、文字列として新たに領域を確保して、返すことがわかり、大変参考になりました。 なんとか対処できました。ありがとうございます。
補足
利用したかったDLLがC言語用で、戻り値をポインターで返すようになっていたからです。 たしかに、検索しても領域を確保したものを引数に渡す例ばかりでてきました。 戻り値の型Pの場合、文字列として新たに領域を確保して、返すことがわかり、大変参考になりました。 戻り値を数値にして、そこからデータ変換をして取得する方法でなんとか対処できました。ありがとうございます。