c# - C# 中 LPCTSTR * 的等效项是什么

标签 c# marshalling

我有一个非托管 C++ 函数驻留在我从 C# 应用程序调用的 Dll 中。这是函数的签名:

GetCrashMeasurement(LPCTSTR channelName, LPCTSTR properties, LPCTSTR * Values, HANDLE error)

其中channelNameproperties是输入参数[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/

相关文章:

c# - P/调用,c# : unsigned char losing a byte

c# - 我怎样才能在 C# 中获得免费的 USB 端口?

Go:JSON 编码错误

c# - 无法更改 WPF 菜单的背景颜色

c# - 有没有办法找出在哪一行抛出异常?

json - 如何创建一个可以由 Gin 序列化为 json 的排序键值映射?

java - 无法使用 JBoss Marshalling API 序列化 org.dom4j.Document

c# - 如何通过 C# 从 C++ dll 调用结构中的函数

c# - 为什么 .NET 中的每个类都继承自 Object?

c# - WPF 触摸和滑动/拖动动画