我有一个非托管 C++ 函数驻留在我从 C# 应用程序调用的 Dll 中。这是函数的签名:
GetCrashMeasurement(LPCTSTR channelName, LPCTSTR properties, LPCTSTR * Values, HANDLE error)
其中channelName
和properties
是输入参数[in]; Values
是一个输出参数[out]。
我还使用从我的 C# 应用程序调用的平台,如下所示:
[DllImport("DrvCrashHAL.dll", EntryPoint = "coCRAL_GetCrashMeasurements")]
public static unsafe extern CoStatus GetCrashMeasurements(string sChannel, string sMeasurements, ref string sValues, IntPtr hError);
在我的 C# 应用程序中,我按以下方式调用该函数:
string Text = "";
intptr herror = intptr.zero;
GetCrashMeasurements("channelname","",ref Text,herror);
但是我的程序正好停在这一行,没有抛出任何异常,我在输出窗口中看到的是以下消息:
Critical error detected c0000374
Critical error detected c0000374
The program '[4964] ProjectX.exe: Managed' has exited with code 0 (0x0).
The program '[4964] ProjectX.exe: Native' has exited with code 0 (0x0).
我的猜测是,问题出在 LPCTSTR
的编码类型上。
谁能告诉我我做错了什么或指出正确的方向?
提前致谢。
最佳答案
据我所知,根据您提供的内容,参数 1、2 和 4 应该可以很好地编码。问题很可能是参数3。
错误 c0000374 是堆损坏。那会合适。
尝试解决您的问题的关键在于了解第三个参数的作用。它被声明为一种 char**
,作为一个 [out] 参数,我希望它作为 char*
输出。换句话说,我希望该函数实际输出一个指针,而不是一个字符串,并期望调用者将收到该指针并从中复制一个(以空字符结尾的)字符串。
您可以通过将入口点重新定义为 int* 或 int** 并传入 intptr 来调查此类调用。这样你应该(a)修复崩溃和(b)看到输出值(作为 int 或指针)。您可能必须为此进行自己的编码。给定一个指向 COM BSTR 的指针,您可以轻松检索所需的值。
但是,根据我对 Interop 规范的阅读,这应该与 out string sValues
而不是 ref
的声明一起正常工作。堆损坏会在函数被调用时发生,而不是在函数返回时发生。
这很有帮助,虽然技术性很强:http://msdn.microsoft.com/en-us/magazine/cc164193.aspx .
我建议您先尝试一下。如果没有,也许可以尝试调试路线以查看您得到的是什么指针。
关于c# - C# 中 LPCTSTR * 的等效项是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22652618/