C++封装的结构体与函数形式如下:typedef struct _DS_INFO{
DWORD apid;
WORD hwid;
WORD flag;
DWORD real_ip_addr;
DWORD pseudo_ip_addr;
DWORD host_ip_addr;
BYTE mac[MACLEN];
}DS_INFO, *PDS_INFO;到处DLL:
IMPORT_EXPORT int SDKCI_FUNC dsc_EnumSearch(DWORD server_ip, WNDENUMSEARCHPROC lpenumproc);typedef int (CALLBACK* WNDENUMSEARCHPROC)(PDS_INFO);
我对应的C#转换调用形式如下: [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct DS_INFO
{
public uint apid;
public ushort hwid;
public ushort flag;
public uint real_ip_addr;
public uint pseudo_ip_addr;
public uint host_ip_addr;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] mac;
} public delegate int ProcessDelegate(ref DS_INFO dsinfo);[DllImport(".\\NECI.dll",CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
unsafe public static extern int dsc_EnumSearch(uint server_ip, ProcessDelegate lpenumproc); int EnumSearchProc( ref DS_INFO dsinfo)
{
Trace.WriteLine("call back ");
}程序调用部分:
try
{
ProcessDelegate newCallproc = new ProcessDelegate(EnumSearchProc);
int ret = dsc_EnumSearch(0xffffffff, newCallproc);
}
catch(Exception ex)
{
throw ex;//System.ArgumentNullException 中第一次偶然出现的“未知模块”类型的异常
}
/////////////////
请问我上述封装有什么问题?DLL可以确定没有任何问题。有意帮忙调试的大侠,请留下EMAIL。
DWORD apid;
WORD hwid;
WORD flag;
DWORD real_ip_addr;
DWORD pseudo_ip_addr;
DWORD host_ip_addr;
BYTE mac[MACLEN];
}DS_INFO, *PDS_INFO;到处DLL:
IMPORT_EXPORT int SDKCI_FUNC dsc_EnumSearch(DWORD server_ip, WNDENUMSEARCHPROC lpenumproc);typedef int (CALLBACK* WNDENUMSEARCHPROC)(PDS_INFO);
我对应的C#转换调用形式如下: [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct DS_INFO
{
public uint apid;
public ushort hwid;
public ushort flag;
public uint real_ip_addr;
public uint pseudo_ip_addr;
public uint host_ip_addr;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] mac;
} public delegate int ProcessDelegate(ref DS_INFO dsinfo);[DllImport(".\\NECI.dll",CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
unsafe public static extern int dsc_EnumSearch(uint server_ip, ProcessDelegate lpenumproc); int EnumSearchProc( ref DS_INFO dsinfo)
{
Trace.WriteLine("call back ");
}程序调用部分:
try
{
ProcessDelegate newCallproc = new ProcessDelegate(EnumSearchProc);
int ret = dsc_EnumSearch(0xffffffff, newCallproc);
}
catch(Exception ex)
{
throw ex;//System.ArgumentNullException 中第一次偶然出现的“未知模块”类型的异常
}
/////////////////
请问我上述封装有什么问题?DLL可以确定没有任何问题。有意帮忙调试的大侠,请留下EMAIL。
解决方案 »
- 接口不能声明类型是什么意思
- 菜鸟求帮助
- 关于winForm窗体设置位置时的问题
- c#关于一个星期删除数据,是不是要用定时器
- 关于控件缩放程序,搞不清问题出在哪
- 请问如何在现有的工程中添加另一个工程中的CheckUpdate的组件?
- C#开发 - 生产线流程图(大家帮帮忙)
- 跪求懂GDI+绘图的朋友帮忙,不胜感激啊
- 想请各位提供一个实例,使用sockets类编写简单的C/S程序,只要求客户端发一字符串,服务器端显示并返回第一个字符,再由客户端显示
- 如何建立与有数据库密码的ACCESS数据库的连接,错误提示:没有可安装的ISAM 指的是什么错误
- 怎么实现文本宽度自适应?
- 创建大容量 Xml 文档出错
你声明在类中,声明为静态字段,应该可以。
static int EnumSearchProc( ref DS_INFO dsinfo)
{
Trace.WriteLine("call back ");
}int ret = dsc_EnumSearch(0xffffffff, EnumSearchProc);依然提示同样的错误。去掉异常捕获,错误行就在dsc_EnumSearch。
请大侠指点。
要不留个EMAIL给我,发给你帮我看看,谢谢。
public delegate int ProcessDelegate(ref DS_INFO dsinfo);改为 public delegate int ProcessDelegate(System.IntPtr dsinfo);之后用Marshal.PtrToStructure在回掉函数里将Ptr转换为对应的结构体或者结构体数组。