C#中LPCTSTR *的等价性是什么?
我有一个非托管的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. 我建议你先尝试一下.如果没有,可以尝试调试路由以查看您获得的指针. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |