C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 27 を表示中)
■12777 / )  Re[2]: VB.NETからVC作成DLLの関数を使用する際の引数
□投稿者/ リバー (3回)-(2008/01/17(Thu) 15:03:38)

魔界の仮面弁士さん、
よねKENさん
早速の回答ありがとうございます。

魔界の仮面弁士さんへ
> StructLayout 属性を指定して、Pack サイズを明示した方が無難かも知れません。
> (デフォルトでは 8 バイトパッキングなので)
  構造体の定義部に
<StructLayout(LayoutKind.Sequential, Pack:=8, CharSet:=CharSet.Auto)> _
  を付与しました。
>
> 戻り値が Int64 型になっていますが、これは間違いありませんか?
>
戻り値の指定が誤っていました。
Integer型に変更したところ戻り値としては正しい値が返ってきました。


> 第2引数は、LPCSTR ではなく、LPSTR なのですよね。
> であれば文字列リテラルでは無く、String 変数を指定した方が良いかも。
String変数を宣言し、指定するように修正しました。



よねKENさんへ
> ○気になる点
> ・各構造体にはStructLayout属性を付加した方がよいかもしれません。
  構造体の定義部に
<StructLayout(LayoutKind.Sequential, Pack:=8, CharSet:=CharSet.Auto)> _
  を付与しました。

> ・Declareで宣言している関数の戻り値は64ビット型のLongでよいのでしょうか?
>  Integerが適切だったりはしませんか?
Integer型に変更したところ戻り値としては正しい値が返ってきました。

> ・文字列はLPSTRとのことですが、ならばAutoでなくAnsiではないでしょうか。
AutoをAnsiに変更しましたが実行結果は同じでした。


> ○確認したい点
>>関数の呼び出しは成功していますが、
>>関数の戻り値が想定外の値になって返ってきます。
>
> ここで言う戻り値というのはどれのことでしょうか?
> 文脈からすると「ByRef _構造体 As 構造体」の部分に対する物を指しているようですが・・・。
> Declare文最後のAs Longは戻り値ですし、
> ByVal LpStr As StringもLPCSTRじゃないので戻り値かもしれませんし。
>
>>構造体の1番目の項目の型:void*をVB側でIntPtr型で
>>宣言している箇所が怪しいと考えていますが、
>>実際どこが間違っていてどう修正するべきかわかりません。
>
> ご提示の情報からは何が間違っているのかを判断できないように思いますので、
>
> ・VC++6側のソースコードはどんな感じの作りなのでしょうか?
> ・そちらの動作に問題ないことは確認が取れているのでしょうか?
> ・どんな値が返ってくると考えて、実際はどんな値が返ってきたのでしょうか?
>
> といった情報も追加でご提示ください。
>
> #この辺は私は得意分野ではないので答えられるかどうかはわかりませんが、
> #そっちが得意な方にとっても必要な情報だと思います。
>

使用する関数の定義としては
引数:

構造体*(ポインタ) I/O
LPSTR I
と定義されていて引数とは別に
戻り値があります。

戻り値の値は
0:正常終了
1:パラメータエラー
2:実行エラー
となっています。

戻り値の型をIntegerに変更する前は0、1、2以外の値が返ってきました。
戻り値の型をIntegerに変更した後は1:パラメータエラーが返ってきました。

パラメータエラーが発生しているということは
VCのソースコードを確認したほうがよさそうですね。

VCのソースコードが手元にないので入手し、調査してみます。
解決次第報告させていただきます。


返信 編集キー/


管理者用

- Child Tree -