求助:C#封装C++的结构体二级指针的问题。

yingfengerchi 2011-06-08 04:27:56
遇到了封装C#封装C++接口的困难,望各位前辈鼎力相助,在此谢过。
现在C++提供的接口中的文件中关键问题是这样定义的

typedef struct tagDB_HANDLE* DB_HANDLE;

DDB_DECL int DBInit(DB_HANDLE* hd, const TCHAR* filename);

DDB_DECL int DBUninit(DB_HANDLE hd);

问题:

1.对C我不是很熟,上面的定义中,我认为tagDB_HANDLE是一个结构体,可是这个结构体在提供的.h文件中被注销了,不明白。

2.接口中的注释只有一部分。对于DBInit函数的第一个参数的意思是没有给出注释?我认为是由它获得hd的指针后,再将它传到下面的DBUninit函数中使用,不知道是不是这样的,现在也只能凭猜测。

3.也就是最重要的,DBInit中的参数应该是结构体的二级指针吧,请问用C#该如果封装呢?如果是一级指针还好办些,但是二级指针实在是没有接触过,网上能找到的方法基本上都试过了,现在没辙了,只有求助大家了。
...全文
126 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
mjp1234airen4385 2011-06-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yingfengerchi 的回复:]
引用 3 楼 mjp1234airen4385 的回复:

你看看,C++的调用例子是什么样的?能不能成功?
如果能成功,把C++的例子发出来,看看。
让大家帮你改。


谢谢,但是它只提供了个注释不全的接口.h,调用文档都没有,更没有给出C++的调用的Demo。现在只能靠自己一步一步的摸索研究了。
[/Quote]

骂它。
jq_whh 2011-06-11
  • 打赏
  • 举报
回复
在C#中使用unsafe关键字,就可以象C++一样操作指针,我只写过简单的代码,不知道对你会不会有帮助。
参考下面的文章:
http://blog.csdn.net/lsd123/archive/2008/09/06/2890377.aspx
yingfengerchi 2011-06-11
  • 打赏
  • 举报
回复
再顶,不会连一个研究此问题的高手都没有吧?
gaibangmengzhu 2011-06-10
  • 打赏
  • 举报
回复
绑定!加油
yingfengerchi 2011-06-09
  • 打赏
  • 举报
回复
继续顶!
yingfengerchi 2011-06-09
  • 打赏
  • 举报
回复
再顶!!!
yingfengerchi 2011-06-08
  • 打赏
  • 举报
回复
自己在顶一下,被刁难不是理由,调用不正确才是自己的问题。
garfieldzf 2011-06-08
  • 打赏
  • 举报
回复
http://blog.csdn.net/okadler0518/archive/2009/06/22/4289679.aspx

C# 封装C++ DLL参数类型比较重要。
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yingfengerchi 的回复:]
但是它只提供了个注释不全的接口.h,调用文档都没有,更没有给出C++的调用的Demo。现在只能靠自己一步一步的摸索研究了。
[/Quote]被故意刁难了?同情。
yingfengerchi 2011-06-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mjp1234airen4385 的回复:]

你看看,C++的调用例子是什么样的?能不能成功?
如果能成功,把C++的例子发出来,看看。
让大家帮你改。
[/Quote]

谢谢,但是它只提供了个注释不全的接口.h,调用文档都没有,更没有给出C++的调用的Demo。现在只能靠自己一步一步的摸索研究了。
mjp1234airen4385 2011-06-08
  • 打赏
  • 举报
回复
你看看,C++的调用例子是什么样的?能不能成功?
如果能成功,把C++的例子发出来,看看。
让大家帮你改。
yingfengerchi 2011-06-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 flyerwing 的回复:]

C# code

[System.Runtime.InteropServices.DllImportAttribute("yourdll", EntryPoint="DBInit")]
public static extern int DBInit(ref System.IntPtr hd, [System.Runtime.InteropServices.InAttribute()]……
[/Quote]

谢谢,你的方法刚刚试了一下,还是没成功。
重要的应该还是第一个参数的封装问题,如果这个参数封送对了,我想我的问题也就解决了。
flyerwing 2011-06-08
  • 打赏
  • 举报
回复

[System.Runtime.InteropServices.DllImportAttribute("yourdll", EntryPoint="DBInit")]
public static extern int DBInit(ref System.IntPtr hd, [System.Runtime.InteropServices.InAttribute()] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPTStr)] string filename) ;
[System.Runtime.InteropServices.DllImportAttribute("yourdll", EntryPoint="DBUninit")]
public static extern int DBUninit(System.IntPtr hd) ;

试下了

110,533

社区成员

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

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

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