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側の構文を書き換えたいのですが、方法がわかりません。
どなたかアドバイスをお願いいたします。
No.4ベストアンサー
- 回答日時:
DLLの関数をCallする前に文字列変数に十分な領域を割り当てているでしょうか?
通常、DLL側ではVB用の文字変数に対して、領域確保などはしません。
DLLの関数をCallする前に
strRecvFile = String(1000, 0)
として
intRtn = HHLFRecv(strRecvFile)
myFile = Left$(strRecvFile, Instr(1,strRecvFile,Chr$(0)))
でどうでしょうか?
回答ありがとうございました。
結局のところ、ファイルの名称を受け取る仕様を組み込む必要がなくなりました。(貴重な回答ありがとうございます。)
この方法はいけそうな感じですね。
仕様上は変更なしなのですが、個人的に気なるので試してみます。
No.5
- 回答日時:
アンマネージドな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 )
といった具合にしましょう
回答ありがとうございました。
結局のところ、ファイルの名称を受け取る仕様を組み込む必要がなくなりました。(貴重な回答ありがとうございます。)
上記方法でいけそうな感じですが、C側のDLLの仕様は変更はできないためラッパーを組むなどの方法が取れそうにないです。
ただ今後同様な事象が発生する場合が想定されるので、参考とさせていただきます。
No.3
- 回答日時:
No.1
- 回答日時:
ByVal→ByRefにしてみてください。
ByValは値渡しで、ByRefは参照渡しです。(ByRefは渡した関数側で書き換え可能です。)
さっそくの回答ありがとうございました。
私のその部分は気にしていて、byrefに変更したのですが、HHLFRecvの関数側でstrRecvFileが正常に渡されていないとDLL側で判断されエラーで帰ってきています。
Byrefにした場合に、strRecvFileの内容(例えば"c:\sendfile")
が渡されてない感じです。
byvalに変更すると正常に終了します。
strRecvFileの型も変更する必要があるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/09 10:33
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/21 13:29
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/02/21 11:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
C++のfor文について
-
2重定義って??
-
C++でboolにintの値を代入する...
-
main.c:7:43: warning: implici...
-
【#define】 defineで定義した...
-
long型の定数の末尾にLを付ける...
-
構造体の宣言でエラーが出ます。
-
戻り値の型??
-
C++ クラスをメンバにもつクラ...
-
変数の型を定義しなかった場合...
-
クラスのメンバ関数を別ファイ...
-
C言語で戻り値を使った正方形の...
-
intとINTの違いは?
-
C++ template operator T()
-
関数の実体定義にヘッダファイ...
-
visualstudio C# テキストボッ...
-
sshdログの意味
-
CStringを含むconst構造体
-
構造体の要素すべてに対する四...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
visualstudio C# テキストボッ...
-
C++のfor文について
-
構造体の要素すべてに対する四...
-
typedef enumの使い方を教えて...
-
変数の型を定義しなかった場合...
-
ハンドルされていない例外が発...
-
関数の実体定義にヘッダファイ...
-
intとINTの違いは?
-
【#define】 defineで定義した...
-
C++でboolにintの値を代入する...
-
構造体の宣言でエラーが出ます。
-
main.c:7:43: warning: implici...
-
プログラムの中で別のmainを呼...
-
void func( void )について
-
エラー「invalid conversion fr...
-
C言語 宣言した変数になにも代...
-
0除算を判定したい
おすすめ情報