加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#中LPCTSTR *的等价性是什么?

发布时间:2020-12-15 22:02:57 所属栏目:百科 来源:网络整理
导读:我有一个非托管的C函数驻留在我从C#应用程序调用的Dll中.这是函数的签名: GetCrashMeasurement(LPCTSTR channelName,LPCTSTR properties,LPCTSTR * Values,HANDLE error) 其中channelName和properties是输入参数[in];和值是输出参数[out]. 我也在使用C#应用
我有一个非托管的C函数驻留在我从C#应用程序调用的Dll中.这是函数的签名:

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

其中channelName和properties是输入参数[in];和值是输出参数[out].

我也在使用C#应用程序中的Platform调用,如下所示:

[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 *输出.换句话说,我希望函数实际输出一个指针,而不是一个字符串,期望调用者将接收该指针并从中复制一个(以null结尾的)字符串.

您可以通过将入口点重新定义为int *或int **并传入intptr来调查此类调用.这样你应该(a)修复崩溃和(b)看到输出值(作为int或指针).您可能必须为此进行自己的编组.给定指向COM BSTR的指针,您可以轻松检索所需的值.

但是,根据我对Interop规范的解读,这应该可以正确处理字符串sValues而不是ref的声明.调用函数时会发生堆损坏,而不是在它返回时.

如果是技术性的话,这很有用:http://msdn.microsoft.com/en-us/magazine/cc164193.aspx.

我建议你先尝试一下.如果没有,可以尝试调试路由以查看您获得的指针.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读