首页 新闻 会员 周边 捐助

C#调用VC DLL 中的指针问题

0
悬赏园豆:10 [已解决问题] 解决于 2009-11-04 00:10

 

Code

 pBufferSize为In/Out,pDllVersion为Out

转化为C#的代码为

定义结构

Code

定义函数

Code

调用

Code

 

报错,请问该如何在C#中调用C++的这种指针结构
System.ExecutionEngineException was unhandled
Message="引发类型为“System.ExecutionEngineException”的异常。"

搞了好一会,都不得而解,希望大家帮帮我,帮我看看哪里出错了。

poplau的主页 poplau | 初学一级 | 园豆:59
提问于:2009-11-03 17:19
< >
分享
最佳答案
0

PR_GetDllsVersion 函数接受两个整形指针,并返回一个无符号整形值.

__declspec(dllexport) 是C/C++导出函数使用的有关存储方式的修饰符,这个你不用管.

你的托管类写错了,CLR有对元数据类型的默认封送方式,而对于struce/class内嵌套数组的时候,

你需要显示指定数组大小,可以使用MarshalAs属性.

uint PR_GetDllsVersion(IntPtr ptr1,IntPtr ptr2);

然后使用Marshal.StructToPtr和Marshal.PtrToStruct来处理结构体和指针的转换.

收获园豆:10
Launcher | 高人七级 |园豆:45050 | 2009-11-03 21:01
谢谢,我解决的方法是这样。不知道这样是否正确。 [StructLayout(LayoutKind.Sequential)] public struct prVerInfo{ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)] public ushort[] ModuleName; /* Module name (512 characters) */ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public ushort[] Version; //32 characters } [StructLayout(LayoutKind.Sequential)] public struct prDllsVerInfo { public uint Entry; [MarshalAs(UnmanagedType.ByValArray, SizeConst = prANY)] public prVerInfo[] VerInfo; //prANY }; 定义 [DllImport("..\\..\\Lib\\PRSDK.dll", CharSet = CharSet.Ansi)] public static extern uint PR_GetDllsVersion( ref uint pBufferSize, ref prType.prDllsVerInfo pDllVersion ); 调用 prDllsVerInfo prDllVerInfo = new prDllsVerInfo(); err = CanonCamera.PR_GetDllsVersion(ref buffersize, ref prDllVerInfo); //ok 不知道这样和你说的IntPtr方式是否一致,另外你能详细写一下Marshal.StructToPtr这种方式的代码吗?谢谢
poplau | 园豆:59 (初学一级) | 2009-11-04 00:07
@poplau: .......显示评论时居然没有"\n\r"替换...
poplau | 园豆:59 (初学一级) | 2009-11-04 00:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册