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获取到记录的名字呢?谢谢.
解决方案 »
- 注册表信息清理
- 服务器遇到内部错误。有关更多信息,请关闭服务器的 .config 文件中的 customErrors。" C#
- 动态导入图片的问题,请高人指点。急!
- 窗体间传递struct型数据时,出现“****引用封送的字段,访问上面的成员可能导致异常”?????
- 奇怪,这种情况下验证控件不起作用了????
- 如何从A.aspx,提交到B.aspx?
- 谁能提供条形码字体?
- [测验]C# 3.0新特性也已经基本定稿了,各种资料层出不穷,但大家对C# 2.0的新特性有多少了解呢?测验一下。
- C# 非正常关闭服务端所造成的客户端连接异常
- 如何获得WIN2000局域网中的所有工作组名称、所有计算机名称、及其所有共享资源
- sql2000报用尽堆栈空间错误
- C#新手,阿斯克码
这里有篇关于C#调用C++动态链接库函数指针与函数结构的文章,希望对你有帮助。
public static extern int GetRecords(ref RecordType ppRecord )
/* 声明 */
[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 hereMarshal.FreeHGlobal(record[0]); //别忘了释放内存,但是我也不确定是否已经全部释放