VC6で作成したDLLをVB6で使用していました。
VB.NETにプロジェクトを変更したところ、DLLの呼び出しの前後で引数に
渡している文字列の内容が変更されてしまいました。
.NETでの正しい呼び方はどうすればよいのでしょうか?
下記の単純なものを作成したのですが、同じ現象でした。
VC側
extern "C" int WINAPI Test( LPCTSTR Msg )
{
return 0;
}
.DEFにてTestを定義
VB.NET側
モジュール
Declare Function Test Lib "dlltest.dll" (ByVal Msg As String) As Integer
フォーム
Dim A As String
A = "あいうえお"
Test(A)
→この段階でAの内容をウォッチで見ると "あい となる
よろしくお願いします
String のマーシャリングについては、このあたりが参考になるかと。
http://www5b.biglobe.ne.jp/~yone-ken/VBNET/special/sp06_GetPrivateProfileString.html
http://www5b.biglobe.ne.jp/~yone-ken/VBNET/Reference/ref2_GetPrivateProfileString.html
早速のご回答ありがとうございます。
魔界の仮面弁士様に教えて頂いたページを参考に以下のように変更することで動作することを確認できました。
マーシャリングの詳細については上記等を参照に勉強したいと思いますが、まずはお礼及びご報告まで。
有難うございました。
VB.NET側
モジュール
Imports System
Imports System.Text
Imports System.Runtime.InteropServices
Module Module1
Declare Function Test Lib "dlltest.dll" (<MarshalAs(UnmanagedType.LPStr)> ByVal Msg As String) As Integer
End Module
ツイート | ![]() |