VC6で作成したDLLを呼び出した際の文字列の渡し方は?

解決


TT  2007-10-09 22:31:22  No: 137726

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の内容をウォッチで見ると "あい  となる

よろしくお願いします


魔界の仮面弁士  2007-10-09 23:16:50  No: 137727

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


TT  2007-10-10 00:28:04  No: 137728

早速のご回答ありがとうございます。
魔界の仮面弁士様に教えて頂いたページを参考に以下のように変更することで動作することを確認できました。
マーシャリングの詳細については上記等を参照に勉強したいと思いますが、まずはお礼及びご報告まで。
有難うございました。

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加