gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:45:51 27 4
gpt4 key购买 nike

我有一个非托管 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com