プロが教えるわが家の防犯対策術!

VB.NET初心者です。
C言語で作られたDLLの戻り値の取得で困ったことが発生しました。
どなたかが解決方法を教えてください。
-----------HHL5d.DLL定義(C言語)-----------
 int HLFRecv ( LPSTR fileName );

----------------------VB側宣言部----------
Declare Function HHLFRecvLib "HHL5d.DLL" _
(ByVal fileName As String) As Integer
※ fileName で指定された場所にファイルを書き込みます。
・ 関数終了時には書き込んだファイルの(ファイル名を含んだ)フルパスがfileNameに上書きされます。

-----------VB側本文----------
Dim strRecvFile As String
Dim intCnt As Integer
 intRtn = HHLFRecv(strRecvFile)

※処理終了後に、strRecvFileにファイル名を含めたフルパスを戻したい。

byval定義の場合は、HHLFRecv関数内で変数の変更ができないため値の取得ができません・・
これを取得できるようにVB側の構文を書き換えたいのですが、方法がわかりません。
どなたかアドバイスをお願いいたします。

A 回答 (5件)

DLLの関数をCallする前に文字列変数に十分な領域を割り当てているでしょうか?


通常、DLL側ではVB用の文字変数に対して、領域確保などはしません。

DLLの関数をCallする前に
strRecvFile = String(1000, 0)
として
intRtn = HHLFRecv(strRecvFile)
myFile = Left$(strRecvFile, Instr(1,strRecvFile,Chr$(0)))
でどうでしょうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
結局のところ、ファイルの名称を受け取る仕様を組み込む必要がなくなりました。(貴重な回答ありがとうございます。)

この方法はいけそうな感じですね。
仕様上は変更なしなのですが、個人的に気なるので試してみます。

お礼日時:2006/11/13 16:22

アンマネージドなDLLを呼び出すのであれば


<MarshalAs(UnmanagedType.VBByRefStr)> などで引数を修飾してやる必要があります
しかし DLL側が書き出すのが LPSTRですとVB.NET側で文字化けしてしまいます
Cでラッパーを組むなりしてユニコードとマルチバイト(MBCS)の変換をしないといけないでしょう

int MBCS2UNICODE(LPWSTR wstr)
{
 LPSTR str = (LPSTR)calloc( sizeof(char_w), wsclen( wstr ) );
 int nRet = HHLFRecv( str );
 int n = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);
 MultiByteToWideChar( CP_ACP, 0, str, -1, wstr, n, NULL, NULL);
 free( (LPVOID)str);
 return nRet;
}
といった具合にして
VB.NET側では
Private Declare Function M2U lib "ラッパーDLL" alias "MBCS2UNICODE" _
(<MarshalAs(UnmanagedType.VBByRefStr)>ByRef str as String)) as Integer
と宣言して

Dim work as String
Dim intRet as Integer
work = Space(100)
intRet = M2U( work )
といった具合にしましょう
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
結局のところ、ファイルの名称を受け取る仕様を組み込む必要がなくなりました。(貴重な回答ありがとうございます。)

上記方法でいけそうな感じですが、C側のDLLの仕様は変更はできないためラッパーを組むなどの方法が取れそうにないです。
ただ今後同様な事象が発生する場合が想定されるので、参考とさせていただきます。

お礼日時:2006/11/13 16:25

過去の質問ですが、参考になるでしょうか。


http://oshiete1.goo.ne.jp/kotaeru.php3?q=711327
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
過去のログを見てみるようにいたします。参考になりそうですね。

お礼日時:2006/11/13 16:23

#1です。


すみません先程の回答ですが間違いかもしれません。
WindowsAPIなどで戻り値を受け取る場合でもByValで定義しますね。
    • good
    • 0
この回答へのお礼

ありがとうございます。
ところが、Byvalで定義している状態でも値は受け渡したときと同じ情報が帰ってきているようなんです。
DLLの仕様では、ファイルの書き込みが正常終了した場合に、書き込んだ変数にファイル名を追加して戻すという仕様になっています。

お礼日時:2006/11/09 18:40

ByVal→ByRefにしてみてください。


ByValは値渡しで、ByRefは参照渡しです。(ByRefは渡した関数側で書き換え可能です。)
    • good
    • 0
この回答へのお礼

さっそくの回答ありがとうございました。
私のその部分は気にしていて、byrefに変更したのですが、HHLFRecvの関数側でstrRecvFileが正常に渡されていないとDLL側で判断されエラーで帰ってきています。
Byrefにした場合に、strRecvFileの内容(例えば"c:\sendfile")
が渡されてない感じです。
byvalに変更すると正常に終了します。
strRecvFileの型も変更する必要があるのでしょうか?

お礼日時:2006/11/09 17:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!