C#调用COM组件时的结构类型数据封送问题,报PInvoke 签名错误

问题描述

Com的idl[id(4),helpstring("methodStructureTest")]HRESULTStructureTest(MyPointa);结构申明typedefstructPoint{intx;inty;}MyPoint;C#中结构包装,函数包装[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]publicstructPoint{[MarshalAs(UnmanagedType.I4)]publicintx;[MarshalAs(UnmanagedType.I4)]publicinty;}publicclassTestStructureDll{[DllImport("DataTypeTest2.dll",CallingConvention=CallingConvention.StdCall,EntryPoint="StructureTest")]publicstaticexternvoidStructureTest2([In,MarshalAs(UnmanagedType.Struct)]Pointa);}函数调用Pointa=newPoint();a.x=1;a.y=2;intx=1;inty=2;TestStructureDll.StructureTest2(a);就出现错误对PInvoke函数“CApp_DllTest!CApp_DllTest.TestStructureDll::StructureTest2”的调用导致堆栈不对称。原因可能是托管的PInvoke签名与非托管的目标签名不匹配。请检查PInvoke签名的调用约定和参数与非托管的目标签名是否匹配。我看了很久,没明白哪里错了,请高手指点~看过Knight94(愚翁)回答的两个问题,我也没弄好~谢谢!(高分相送)

解决方案

解决方案二:
帮顶
解决方案三:
数据类型错了,Win32的Long并不对应.NET下的Long。检查一下数据类型
解决方案四:
应该是参数问题,int换成byte看看,c里的int是8位,而c#里的int=int32是32位,用UnmanagedType.I4强行转成为8位不知道会不会出问题publicstructPoint{[MarshalAs(UnmanagedType.I4)]publicbytex;[MarshalAs(UnmanagedType.I4)]publicbytey;}
解决方案五:
Int32
解决方案六:
然后c#里的byte是8位
解决方案七:
自己对应一下BOOL=System.Int32BOOLEAN=System.Int32BYTE=System.UInt16CHAR=System.Int16COLORREF=System.UInt32DWORD=System.UInt32DWORD32=System.UInt32DWORD64=System.UInt64FLOAT=System.FloatHACCEL=System.IntPtrHANDLE=System.IntPtrHBITMAP=System.IntPtrHBRUSH=System.IntPtrHCONV=System.IntPtrHCONVLIST=System.IntPtrHCURSOR=System.IntPtrHDC=System.IntPtrHDDEDATA=System.IntPtrHDESK=System.IntPtrHDROP=System.IntPtrHDWP=System.IntPtrHENHMETAFILE=System.IntPtrHFILE=System.IntPtrHFONT=System.IntPtrHGDIOBJ=System.IntPtrHGLOBAL=System.IntPtrHHOOK=System.IntPtrHICON=System.IntPtrHIMAGELIST=System.IntPtrHIMC=System.IntPtrHINSTANCE=System.IntPtrHKEY=System.IntPtrHLOCAL=System.IntPtrHMENU=System.IntPtrHMETAFILE=System.IntPtrHMODULE=System.IntPtrHMONITOR=System.IntPtrHPALETTE=System.IntPtrHPEN=System.IntPtrHRGN=System.IntPtrHRSRC=System.IntPtrHSZ=System.IntPtrHWINSTA=System.IntPtrHWND=System.IntPtrINT=System.Int32INT32=System.Int32INT64=System.Int64LONG=System.Int32LONG32=System.Int32LONG64=System.Int64LONGLONG=System.Int64LPARAM=System.IntPtrLPBOOL=System.Int16[]LPBYTE=System.UInt16[]LPCOLORREF=System.UInt32[]LPCSTR=System.StringLPCTSTR=System.StringLPCVOID=System.UInt32LPCWSTR=System.StringLPDWORD=System.UInt32[]LPHANDLE=System.UInt32LPINT=System.Int32[]LPLONG=System.Int32[]LPSTR=System.StringLPTSTR=System.StringLPVOID=System.UInt32LPWORD=System.Int32[]LPWSTR=System.StringLRESULT=System.IntPtrPBOOL=System.Int16[]PBOOLEAN=System.Int16[]PBYTE=System.UInt16[]PCHAR=System.Char[]PCSTR=System.StringPCTSTR=System.StringPCWCH=System.UInt32PCWSTR=System.UInt32PDWORD=System.Int32[]PFLOAT=System.Float[]PHANDLE=System.UInt32PHKEY=System.UInt32PINT=System.Int32[]PLCID=System.UInt32PLONG=System.Int32[]PLUID=System.UInt32PSHORT=System.Int16[]PSTR=System.StringPTBYTE=System.Char[]PTCHAR=System.Char[]PTSTR=System.StringPUCHAR=System.Char[]PUINT=System.UInt32[]PULONG=System.UInt32[]PUSHORT=System.UInt16[]PVOID=System.UInt32PWCHAR=System.Char[]PWORD=System.Int16[]PWSTR=System.StringREGSAM=System.UInt32SC_HANDLE=System.IntPtrSC_LOCK=System.IntPtrSHORT=System.Int16SIZE_T=System.UInt32SSIZE_=System.UInt32TBYTE=System.CharTCHAR=System.CharUCHAR=System.ByteUINT=System.UInt32UINT32=System.UInt32UINT64=System.UInt64ULONG=System.UInt32ULONG32=System.UInt32ULONG64=System.UInt64ULONGLONG=System.UInt64USHORT=System.UInt16WORD=System.UInt16WPARAM=System.IntPtr
解决方案八:
你的问题主要就是COMInterop过程中的数据封送问题。楼上有人已经给出了正确的答案。但是如果只获得答案,不知道原理,以后遇到了此类问题还是不知道如何下手。如果你想系统学习如何进行数据封送,我推荐你阅读刚刚出版的新书:《精通.NET互操作P/Invoke,C++Interop和COMInterop》,这本书的第5,6章“COMInterop”,详细介绍了COMInterop,非常详细,我就是读完后才搞清楚COMInterop中的封送处理等问题。该书的官方网站:豆瓣网信息:

时间: 2024-10-27 19:21:13

C#调用COM组件时的结构类型数据封送问题,报PInvoke 签名错误的相关文章

C#调用matlab混合编程时总是出现类型初始值设定项引发异常这种错误

问题描述 C#调用matlab混合编程时总是出现类型初始值设定项引发异常这种错误,请问该如何解决?matlab源码如下:function[y,z]=myadd2(a,b)%dummyfunction,justtodemonstratetheideay=a+b;z=a+2*b;endC#源码如下usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Dra

调用淘宝api问题,获取数据response那一行报错

问题描述 调用淘宝api问题,获取数据response那一行报错 TaobaoClient client = new DefaultTaobaoClient(su.getUrl(), su.getAppKey(), su.getAppSercet()); WangwangEserviceGroupmemberGetRequest req = new WangwangEserviceGroupmemberGetRequest (); if(managerId!=null && !"

导出Excel时,数字类型数据被转换为字符类型,导致Excel公式无法计算

问题描述 开发平台:VS2005开发语言:C#问题:使用客户提供模板,对Excel文件进行数据填充时,数字类型的数据被转换为字符类型(单元格左上方有绿色的三角),导致Excel公式无法进行计算. 解决方案 解决方案二:你可以修改模板的列,设置格式为数字而非常规.然后导出就是数字了.解决方案三:在模板上强制设置格式为数字

调用C++DLL时遇到结构体类型难题

问题描述 C++DLL里的一个函数:HRESULTDSStream_EnumVideoCompressor(VideoCompressorInfo*pInfo,int*piVidCompNum)得到系统中安装的视频压缩算法的信息.pInfo:指向一片预先分配的VideoCompressorInfo结构.如果为NULL,piVidCompNum将得到系统中安装的视频压缩算法的数目.piVidCompNum:如果pInfo不为NULL,piVidCompNum表示pInfo中包含多少个VideoCo

环信集成到项目中测试时出现魅蓝手机点击发送位置报错

问题描述 一种情况是找不到baiduSdk的so文件     修改后一种是找到的是32bits而不是64bits 解决方案 如果你的app中有第三方的服务启动,请在初始化SDK (EMChat.getInstance().init(applicationContext))方法的前面添加以下相关代码(相应代码也可参考demo的application)  if (processAppName == null ||!processAppName.equalsIgnoreCase("com.easemo

通过struts Action调用Tiles组件

问题描述 struts-config.xml:<action-mappings><actionpath="/index"type="org.apache.struts.actions.ForwardAction"parameter="index-definition"></action></action-mappings>tiles-defs.xml:<tiles-definitions>

刻录程序报错,调用COM组件失败的问题

问题描述 usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Runtime.InteropServices;//usingIMAPI2FS;usingIMAPI2.Interop;usingSystem.Runtime.InteropServices.ComTypes;namespaceBurnCD{internalclassRecorder:IRecorder{#regionIRecorder成员/

VB.Net 调用C++ DLL时涉及到回调函数的问题

问题描述 问题描述:C/C++中的回调函数的定义如下:typedefint(*STREAM_DIRECT_READ_CALLBACK)(ULONGchannelNumber,void*DataBuf,DWORDLength,intFrameType,void*context);我在VB.Net中定义的回调函数如下:PublicDelegateFunctionSTREAM_DIRECT_READ_CALLBACK(ByValchannelNumberAsUInt32,ByValDataBufAsI

“在引用COM组件时,出现了无法嵌入互操作类型。。。”的错误

这两天在做一个需要将wps文档转换成word文档的程序,在调用wps的com组件时项目编译是没有问题的,但当运行的时候却弹出了下面的错误提示: 从网上百度一番后,找到了正确的解决方法.  先从Com组件中添加引用: 选中引入的Com组件库,右键-> 属性: 将"嵌入互操作类型"改为 False 选项:   重新编译,程序正常运行.   由此,让我联想到了在前不久一个朋友在使用Office组件用来转换pdf文档时,出现的 "无法嵌入互操作类型..."的问题,记得