当前位置:编程学习 > C#/ASP.NET >>

C#下调用C++ DLL中函数

查询局域网设备

BOOL CLIENT_SearchDevices(
  char*      szBuf,
  int        nBufLen,
  int*       pRetLen,
  DWORD      dwSearchTime
);
Parameters
[out]szBuf 
用户开辟缓存,用来接收DEVICE_NET_INFO结构体,查询到几个设备,就返回几个这样的结构体 
[in]nBufLen 
szBuf缓存长度 
[out]pRetLen 
返回DEVICE_NET_INFO结构体长度之和 
[in]dwSearchTime 
查询等待时间 


请问这个函数在C#中应该如何定义 --------------------编程问答-------------------- char* 试试string或stringbuilder
int* 试试 ref int --------------------编程问答--------------------
引用 1 楼  的回复:
char* 试试string或stringbuilder
int* 试试 ref int


[out]szBuf  
用户开辟缓存,用来接收DEVICE_NET_INFO结构体,查询到几个设备,就返回几个这样的结构体  

这个参数输出的是结构 --------------------编程问答-------------------- /// <summary>
        /// QQ/TM聊天记录获取
        /// </summary>
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct SendQQMsgInfo
        {
            /// <summary>
            /// 聊天类型:0=单人聊天,1=群聊天,2=讨论组聊天
            /// </summary>
            public uint QQMsgType;
            /// <summary>
            /// 本机QQ号码
            /// </summary>
            public uint SourceQQNum;
            /// <summary>
            /// 对方QQ号码
            /// </summary>
            public uint DestinationQQNum;
            /// <summary>
            /// 群号码或聊天组号码
            /// </summary>
            public uint GroupNum;
            /// <summary>
            /// 消息类型:true=发送,false=接收
            /// </summary>
            public bool bSend;
            /// <summary>
            /// 本机QQ昵称
            /// </summary>
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 30)]
            public string SourceString;
            /// <summary>
            /// 对方QQ昵称或群聊天中消息发送人的昵称
            /// </summary>
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 40)]
            public string DestinationString;
            /// <summary>
            /// 群名或聊天组名
            /// </summary>
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 30)]
            public string GroupNameString;
            /// <summary>
            /// 消息内容
            /// </summary>
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 7000)]
            public string TextString;
        }

结构体定义其中string在c++中是char[30]\char[7000]等等。。。
char*如果在结构体里。最好放在结构体最后面。越长的越放后面
 /// <summary>
        /// 取消QQ的进程保护(若不取消则无法获取聊天记录)
        /// </summary>
        /// <returns></returns>
        [DllImport("DCKillQQProctect.dll")]
        public static extern bool KillQQProctect();

        /// <summary>
        /// 获取QQ/TM聊天记录
        /// </summary>
        /// <param name="sendmess"></param>
        /// <returns></returns>
        public delegate bool GetQQMsg(ref SendQQMsgInfo sendmess);

以上是我的写法。通过测试的

public delegate bool CLIENT_SearchDevices(byte[] szBuf,int nBufLen,ref pRetLen,DWORD dwSearchTime);
可以试试










--------------------编程问答-------------------- 1.把结构体定义贴出来
2.用定义的结构体数组作为szBuf的参数类型,并指定[Out][MarshalAs(UnmanagedType.LPArray)] --------------------编程问答--------------------
引用 4 楼  的回复:
1.把结构体定义贴出来
2.用定义的结构体数组作为szBuf的参数类型,并指定[Out][MarshalAs(UnmanagedType.LPArray)]


结构如下:

DEVICE_NET_INFO{
  char   szIP[DH_MAX_IPADDR_LEN];  
  int    nPort; 
  char   szSubmask[DH_MAX_IPADDR_LEN];
  char   szGateway[DH_MAX_IPADDR_LEN];
  char   szMac[DH_MACADDR_LEN];
  char   szDeviceType[DH_DEV_TYPE_LEN];
  BYTE   bReserved[32];
};
Members
szIP 
IP地址,字符串形式。 
nPort 
端口号,本地序。 
szSubmask 
子网掩码,字符串形式。 
szGateway 
网关,字符串形式 
szMac 
MAC地址,字符串形式。 
szDeviceType 
设备类型,字符串形式 
bReserved 
保留字节 
--------------------编程问答-------------------- 顶起来 --------------------编程问答-------------------- http://wenku.baidu.com/view/5126f84b2b160b4e767fcf85.html?st=1这个绝对有用! --------------------编程问答-------------------- 自己先顶起来,希望有高手来帮忙解决 --------------------编程问答-------------------- --------------------编程问答-------------------- 自己先顶起来,希望有高手来帮忙解决 --------------------编程问答-------------------- 求达人解答 --------------------编程问答-------------------- 最后结果解决了吗?我也遇到这个问题啊
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,