C++;DLL LPCTSTR到C#字符串 我试图从C++到dcll得到字符串。 它输出不正确的符号-{栠搂珯獲긋ݳݳ贈琹玴ɡݳ⻜}
这是我的密码: C++ DLL <>我的C代码读取C++ +DLL:C++;DLL LPCTSTR到C#字符串 我试图从C++到dcll得到字符串。 它输出不正确的符号-{栠搂珯獲긋ݳݳ贈琹玴ɡݳ⻜},c#,c++,dll,C#,C++,Dll,这是我的密码: C++ DLL 我的C代码读取C++ +DLL: [DllImport("ecrClassDll.dll", CharSet = CharSet.Unicode)] static extern void myClass(StringBuilder z); static void Main(string[] args) { StringBuilder z = new StringBuilder(); myClass(z); } 首先,确保您在C++中定义了 U
[DllImport("ecrClassDll.dll", CharSet = CharSet.Unicode)]
static extern void myClass(StringBuilder z);
static void Main(string[] args)
{
StringBuilder z = new StringBuilder();
myClass(z);
}
首先,确保您在C++中定义了<代码> Unicode < /Code >宏,以便输出<代码> WHARGYTT < /Code >数据,以及
LPCTSTR
意味着 conthWal查*t*
。这就是 CalSc. Unicode
期望的。顺便说一下,如果您不打算支持ANSI版本,我也不会理会所有的<代码>e> 只要到处使用Unicode,代码就会更简单
也可以,你的C++函数返回一个<代码> int <代码>,但是你的C函数期望一个<代码>无效>代码>。你有一个错配(除非你打算把<代码> PreserveSig <代码> > <代码> false <代码> >
在C的边,当你提供<代码> StringBuilder < /C>时,它意味着你为C++提供了一个缓冲区,你希望它能填充那个缓冲区。正确的用法是这样的:
\u declspec(dllexport)int\u stdcall myClass(LPCTSTR z,intzsize)
{
_tcscpy_s(z,zSize,_T(“测试字符串”);
返回0;
}
[DllImport(“ecrClassDll.dll”,CharSet=CharSet.Unicode)]
静态外部intMyClass(StringBuilderZ,intzSize);
静态void Main(字符串[]参数)
{
StringBuilder z=新的StringBuilder(256);
myClass(z,z.容量);
}
但是您的代码返回一个指向静态字符串的指针,这是封送拆收器在这里不希望看到的
如果你想保持你的C++代码,你可以试试这个:
[DllImport("ecrClassDll.dll", CharSet = CharSet.Unicode)]
static extern int myClass(out string z);
static void Main(string[] args)
{
string z;
myClass(out z);
}
我承认我没有测试过,但是它应该与C++签名匹配C++签名。 如果所有操作都失败,您可以尝试自行封送数据:
[DllImport("ecrClassDll.dll")]
static extern unsafe int myClass(void** z);
static unsafe void Main(string[] args)
{
void* z;
myClass(&z);
var str = Marshal.PtrToStringUni(new IntPtr(z));
}
我已经尝试了字符串,但我的控制台应用程序没有错误,仅此而已..如果我包括pdb文件,它会在CallDLL.exe中返回“0x7746ED0B(ntdll.dll)处未处理的异常:0xC0000374:堆已损坏(参数:0x774A4270)。”而C#堆中的字符串损坏,意味着签名不匹配…嗯,您可以尝试
[Marshallas](UnmanagedType.LPWStr)
但我认为它不会有太大变化。我在答案中添加了第三种方法。谢谢你的回答!我发现在我的例子中,“out string”只在4.0或更低版本的框架下工作,x86,并且只在发布模式下工作(我需要你帮助的原始DLL不是我的)。这很奇怪。只在x86中工作是可以的(你的C++ DLL是x86),但不工作在4.5 +和调试模式是一个红旗,我不能想到任何理由,这样会发生…
[DllImport("ecrClassDll.dll")]
static extern unsafe int myClass(void** z);
static unsafe void Main(string[] args)
{
void* z;
myClass(&z);
var str = Marshal.PtrToStringUni(new IntPtr(z));
}