带**的dll函数如何DllImport到C#?还有,如何实现struct中包含struct的链表?

时间:2022-08-31 09:06:38
带**的dll函数如何DllImport到C#?还有,如何实现struct中包含struct的链表?

请注意下方代码的3个地方:
1、long DLLAPI apiGetStationList(long lLoginID,  TDeviceList **pptStationList);
2、TDeviceNodeInfo *ptNodeInfo;           //这里比较理想的应该如何申明?
3、struct T_Device_Node_Info                *ptNextNode;    //这里好像是链表,如何申明



long DLLAPI apiGetStationList(long lLoginID, TDeviceList **pptStationList);



typedef struct T_Device_List
{
DWORD                                       dwNodeCount;
TDeviceNodeInfo                          *ptNodeInfo;           //这里比较理想的应该如何申明?
}TDeviceList;

typedef struct T_Device_Node_Info
{
char                          achType[MAX_NODEUNIT_LEN + 1];//Camera or Station 
char                          achName[MAX_NODEUNIT_LEN + 1];//Camera(C_XXX) or Station(S_XXX)
char                          achRefName[MAX_REFNAME_LEN + 1];
char                          achIP[MAX_IPHOST_LEN + 1];
DWORD                   dwPort;
char                          achUser[MAX_USERNAME_LEN + 1];
char                          achPwd[MAX_HEXPWD_LEN + 1];
struct T_Device_Node_Info       *ptNextNode;        //这里好像是链表,如何申明
} TDeviceNodeInfo;



10 个解决方案

#1


[StructLayout(LayoutKind.Sequential)]
class TDeviceList
{
   public int dwNodeCount;
   public  IntPtr ptNodeInfo;
}

[DllImport(...)]
extern static int apiGetStationList(int lLoginID,  ref TDeviceList pptStationList);

#2


自己构造一个链表的TDeviceNodeInfo

#3


楼主贴出的代码是C++的,是dll里面的?

#4


引用 3 楼 qiujialongjjj 的回复:
楼主贴出的代码是C++的,是dll里面的?


long DLLAPI apiGetStationList(long lLoginID, TDeviceList **pptStationList);   这个是dll提供的一个函数。

TDeviceList、TDeviceNodeInfo  是dll会用到的两个结构体。

我是要写一个DllImport,把这个函数引出来。 就这个函数比较难,也比较具有代表性意义。

还有这个函数,也是要引出来的。
long DLLAPI apiGetCameraList(long lLoginID, TDeviceNodeInfo *ptStationNode, TDeviceList **pptCameraList);

这里头有一个*的参数也有两个*的参数。

没办法提供测试dll,因为这个dll要基于视频服务器上运行。



#5


带*的貌似是指针吧

#6


是指针,就是如何在C#中编写。

#7


用unsafe用指针最简单。

#8


C#有指针的,既然都是结构体,那么直接用指针即可

#9


该回复于2014-03-21 17:16:47被管理员删除

#10


我用VC写成控件了,然后引出一些简单的参数

#1


[StructLayout(LayoutKind.Sequential)]
class TDeviceList
{
   public int dwNodeCount;
   public  IntPtr ptNodeInfo;
}

[DllImport(...)]
extern static int apiGetStationList(int lLoginID,  ref TDeviceList pptStationList);

#2


自己构造一个链表的TDeviceNodeInfo

#3


楼主贴出的代码是C++的,是dll里面的?

#4


引用 3 楼 qiujialongjjj 的回复:
楼主贴出的代码是C++的,是dll里面的?


long DLLAPI apiGetStationList(long lLoginID, TDeviceList **pptStationList);   这个是dll提供的一个函数。

TDeviceList、TDeviceNodeInfo  是dll会用到的两个结构体。

我是要写一个DllImport,把这个函数引出来。 就这个函数比较难,也比较具有代表性意义。

还有这个函数,也是要引出来的。
long DLLAPI apiGetCameraList(long lLoginID, TDeviceNodeInfo *ptStationNode, TDeviceList **pptCameraList);

这里头有一个*的参数也有两个*的参数。

没办法提供测试dll,因为这个dll要基于视频服务器上运行。



#5


带*的貌似是指针吧

#6


是指针,就是如何在C#中编写。

#7


用unsafe用指针最简单。

#8


C#有指针的,既然都是结构体,那么直接用指针即可

#9


该回复于2014-03-21 17:16:47被管理员删除

#10


我用VC写成控件了,然后引出一些简单的参数