c#调用C++ dll,函数参数为结构体指针的问题

zaijzhgh 2012-04-05 09:25:01

C/C++中的定义如下:
/* 结构体定义*/
typedef struct _tag_RECORD
{
struct _tag_RECORD *next;
unsigned short *pName;
}RECORD_T, *P_RECORD_T;

/* 函数声明 */
int GetRecords(P_RECORD_T ppRecord[]);

在C#中需要调用GetRecords来获取相应的记录,pName内存应该是在dll中申请的.

我在C#中定义结构体如下:
public struct RecordType
{
public IntPtr next;

[MarshalAs(UnmanagedType.LPWStr)]
public string pName;
}

但是接下来却不知道怎么写了.

请问,如何在C#中调用GetRecords获取到记录的名字呢?谢谢.
...全文
590 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
myazrael 2012-04-05
  • 打赏
  • 举报
回复
http://www.dreamdu.com/blog/2008/04/25/cs_cpp_functionpointer/
这里有篇关于C#调用C++动态链接库函数指针与函数结构的文章,希望对你有帮助。
zaijzhgh 2012-04-05
  • 打赏
  • 举报
回复
今天终于解决了这个问题,LS的都没有正确回答.不管怎么样,还是谢谢了.可惜不能给自己分数呀.哈哈.


/* 声明 */
[DllImport("***.dll")]
public static extern int GetRecords(IntPtr[] ppRecord);

int cnt = 1; //根据查询情况赋值,这里只查一个
int result = -1;
IntPtr[] record = new IntPtr[cnt]; //申请内存空间

record[0] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(RECORD_T)) * cnt); //这样是okay的?我尝试了是没有问题的,但不保证
result = GetRecords(record);
if(0x00 != result)
{
//do something here
return;
}
else
{
RECORD_T tagInfo;

for (int i = 0; i < cnt; i++)
{
tagInfo = (RECORD_T)Marshal.PtrToStructure((IntPtr)((UInt32)record[i]),
typeof(RECORD_T));
//这里就成功获取到了信息了
}
}



... //more operation here

Marshal.FreeHGlobal(record[0]); //别忘了释放内存,但是我也不确定是否已经全部释放

nvshenxp 2012-04-05
  • 打赏
  • 举报
回复
[DllImport("**.dll")]//你要导入的库函数
public static extern int GetRecords(ref RecordType ppRecord )

110,578

社区成员

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

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

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