[高分求助] C# 调用一个COM接口报出异常的问题

piaoxin 2013-01-19 08:12:58
原来那个帖子沉了,重发一下。

使用c#调用COM的一个接口,抛出异常

未处理的“System.AccessViolationException”类型的异常出现在 SDKTestClientSampleCodeCSharp.exe 中。
其他信息: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

1. 这个COM接口在C++ 中的格式为
virtual HRESULT __stdcall StartConversationEx (
/*[in]*/ struct CALL_INFO callInfo,
/*[in]*/ enum CALL_MEDIA_TYPE eCallMediaType,
/*[out]*/ long * pConversationId ) = 0;

CALL_INFO的定义如下:
CALL_INFO
{
enum ADDRESS_TYPE addressType;
BSTR bstrValue;
};


2. 在C#工程中添加引用后,元数据中的格式为
void StartConversationEx(CALL_INFO callInfo, CALL_MEDIA_TYPE eCallMediaType, out int pConversationId);

采用下面代码调用:
CALL_INFO callInfo;
callInfo.addressType = ADDRESS_TYPE.ADDRESS_URI;
callInfo.bstrValue = m_strTelnos;

m_phone.StartConversationEx(callInfo, CucRtxExeProviderLib.CALL_MEDIA_TYPE.CALL_MEDIA_VIDEO,
out m_ConversationId);


大侠帮看看是我C#使用的有问题吗,求指教
...全文
177 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
piaoxin 2013-01-20
  • 打赏
  • 举报
回复
还没有解决,高手给点思路啊
piaoxin 2013-01-19
  • 打赏
  • 举报
回复
CALL_INFO在导入COM 相应的lib后是有定义的 [Guid("59179106-B5FE-4C69-8B06-12D6896F97D6")] public struct CALL_INFO { public ADDRESS_TYPE addressType; public string bstrValue; } 只是我声明这个结构体,直接传入api中,出错。 如果声明Marshal为IntPtr后,怎么传啊,因为那个COM接口在C#中的原型,就是要一个结构体 [DispId(2)] void StartConversationEx(CALL_INFO callInfo, CALL_MEDIA_TYPE eCallMediaType, out int pConversationId);
引用 4 楼 owennol 的回复:
CALL_INFO { enum ADDRESS_TYPE addressType; BSTR bstrValue; // 第二个参数为BSTR,直接定义成string,有问题吧??? }; C++的这个字符串定义有没有长度,有长度的话,转成Char数组: [StructLayout(LayoutKind.Sequential)]……
owennol 2013-01-19
  • 打赏
  • 举报
回复
CALL_INFO { enum ADDRESS_TYPE addressType; BSTR bstrValue; // 第二个参数为BSTR,直接定义成string,有问题吧??? }; C++的这个字符串定义有没有长度,有长度的话,转成Char数组: [StructLayout(LayoutKind.Sequential)] public struct CALL_INFO { public enum ADDRESS_TYPE addressType; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 48)] public char[] bstrValue; } 或者先改成Intptr试下: CALL_INFO { enum ADDRESS_TYPE addressType; Intptr bstrValue; };
piaoxin 2013-01-19
  • 打赏
  • 举报
回复
有个疑问,在C#中这个参数是个结构,而不是结构体指针,是否能用IntPtr?
引用 楼主 piaoxin 的回复:
原来那个帖子沉了,重发一下。 使用c#调用COM的一个接口,抛出异常 未处理的“System.AccessViolationException”类型的异常出现在 SDKTestClientSampleCodeCSharp.exe 中。 其他信息: Attempted to read or write protected memory. This is of……
piaoxin 2013-01-19
  • 打赏
  • 举报
回复
新手,求语法
引用 楼主 piaoxin 的回复:
原来那个帖子沉了,重发一下。 使用c#调用COM的一个接口,抛出异常 未处理的“System.AccessViolationException”类型的异常出现在 SDKTestClientSampleCodeCSharp.exe 中。 其他信息: Attempted to read or write protected memory. This is of……
只在此山中 2013-01-19
  • 打赏
  • 举报
回复
CALL_INFO callInfo 改用 IntPtr callInfo 传递
piaoxin 2013-01-19
  • 打赏
  • 举报
回复
再顶一下啊。。。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧