很多时候为了做集成我们别无选择的要用C#来调用C/C++的API,如果你对C#和C/C++数据类型对应关系不是很了解,那么这就是一件很头疼的事情了。
下面来看看具体怎么使用
void* OpenDevice(int nMyAddress, HWND hWnd)
void CloseDevice(void* pDevice)
void SetMyAddress(void* pDevice, int nAddress)
BOOL ConnectPort(void* pDevice, LPCTSTR lpCommDef)
BOOL IsConnect(void* pDevice)
void SetAddLog(void* pDevice, BOOL bAddLog)
void SetCommKey(void* pDevice, LPCTSTR lpCommKey)
void SetInnerCode (void* pDevice, BOOL bBig5)
BOOL DisConnectPort(void* pDevice)
void SetWaitTime(void* pDevice, DWORD dwWaitTime)
void* StartICDMCommand(void* pDevice, int nAddress, int nCommand,
void* pParameters = NULL, int nSizeOfParameter = 0)
int GetSizeOfData(void* pCommand)
BOOL GetData(void* pCommand, void* pDataBuffer, int nSize)
int GetCmdResult(void* pCommand)
void EndICDMCommand(void* pCommand)
void RecvEdition(LPTSTR lpEdition)
void CloseDevice(void* pDevice)
void SetMyAddress(void* pDevice, int nAddress)
BOOL ConnectPort(void* pDevice, LPCTSTR lpCommDef)
BOOL IsConnect(void* pDevice)
void SetAddLog(void* pDevice, BOOL bAddLog)
void SetCommKey(void* pDevice, LPCTSTR lpCommKey)
void SetInnerCode (void* pDevice, BOOL bBig5)
BOOL DisConnectPort(void* pDevice)
void SetWaitTime(void* pDevice, DWORD dwWaitTime)
void* StartICDMCommand(void* pDevice, int nAddress, int nCommand,
void* pParameters = NULL, int nSizeOfParameter = 0)
int GetSizeOfData(void* pCommand)
BOOL GetData(void* pCommand, void* pDataBuffer, int nSize)
int GetCmdResult(void* pCommand)
void EndICDMCommand(void* pCommand)
void RecvEdition(LPTSTR lpEdition)
上面是api接口原函数
如果想要在C#里面使用就要重新定义以为他是非托管类行
[DllImport("DLL4k.dll", ExactSpelling = false, EntryPoint = "OpenDevice")]
public static extern IntPtr OpenDevice(int nMyAddress, IntPtr hwnd);
[DllImport("DLL4k.dll", SetLastError = true, EntryPoint = "CloseDevice")]
public static extern void CloseDevice(IntPtr hwnd);
[DllImport("DLL4k.dll", SetLastError = true)]
public static extern void SetMyAddress(IntPtr hwnd, int nMyAddress);
[DllImport("DLL4k.dll", ExactSpelling = false, EntryPoint = "ConnectPort")]
public static extern bool ConnectPort(IntPtr pDevice, StringBuilder port);
[DllImport("DLL4k.dll", SetLastError = true, EntryPoint = "IsConnect")]
[return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]
public static extern bool IsConnect(IntPtr pDevice);
[DllImport("DLL4k.dll", SetLastError = true, EntryPoint = "SetAddLog")]
public static extern void SetAddLog(IntPtr pDevice, bool isaddlog);
[DllImport("DLL4k.dll", SetLastError = true)]
public static extern void SetCommKey(IntPtr pDevice, string str);
[DllImport("DLL4k.dll", SetLastError = true)]
public static extern void SetInnerCode(IntPtr pDevice, bool isbog5);
[DllImport("DLL4k.dll", SetLastError = true, EntryPoint = "DisConnectPort")]
[return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]
public static extern bool DisConnectPort(IntPtr pDevice);
[DllImport("DLL4k.dll", SetLastError = true, EntryPoint = "SetWaitTime")]
public static extern void SetWaitTime(IntPtr pDevice, int dwWaitTime);
[DllImport("DLL4k.dll", ExactSpelling = false, EntryPoint = "StartICDMCommand")]
public static extern IntPtr StartICDMCommand(IntPtr pDevice, int nAddress, int nCommand, IntPtr pParameters, int nSizeOfParameter = 0);
[DllImport("DLL4k.dll", EntryPoint = "GetSizeOfData", SetLastError = true, CharSet = CharSet.Auto)]
public static extern int GetSizeOfData(IntPtr pParameters);
[DllImport("DLL4k.dll", EntryPoint = "GetData", SetLastError = true)]
[return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]
public static extern bool GetData(IntPtr pCommand, IntPtr pDataBuffer, int nSize);
[DllImport("DLL4k.dll", SetLastError = true, EntryPoint = "GetCmdResult")]
public static extern int GetCmdResult(IntPtr pCommand);
[DllImport("DLL4k.dll", SetLastError = true, EntryPoint = "EndICDMCommand")]
public static extern void EndICDMCommand(IntPtr pDevice);
[DllImport("DLL4k.dll", SetLastError = true)]
public static extern void RecvEdition(string str);
public static extern IntPtr OpenDevice(int nMyAddress, IntPtr hwnd);
[DllImport("DLL4k.dll", SetLastError = true, EntryPoint = "CloseDevice")]
public static extern void CloseDevice(IntPtr hwnd);
[DllImport("DLL4k.dll", SetLastError = true)]
public static extern void SetMyAddress(IntPtr hwnd, int nMyAddress);
[DllImport("DLL4k.dll", ExactSpelling = false, EntryPoint = "ConnectPort")]
public static extern bool ConnectPort(IntPtr pDevice, StringBuilder port);
[DllImport("DLL4k.dll", SetLastError = true, EntryPoint = "IsConnect")]
[return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]
public static extern bool IsConnect(IntPtr pDevice);
[DllImport("DLL4k.dll", SetLastError = true, EntryPoint = "SetAddLog")]
public static extern void SetAddLog(IntPtr pDevice, bool isaddlog);
[DllImport("DLL4k.dll", SetLastError = true)]
public static extern void SetCommKey(IntPtr pDevice, string str);
[DllImport("DLL4k.dll", SetLastError = true)]
public static extern void SetInnerCode(IntPtr pDevice, bool isbog5);
[DllImport("DLL4k.dll", SetLastError = true, EntryPoint = "DisConnectPort")]
[return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]
public static extern bool DisConnectPort(IntPtr pDevice);
[DllImport("DLL4k.dll", SetLastError = true, EntryPoint = "SetWaitTime")]
public static extern void SetWaitTime(IntPtr pDevice, int dwWaitTime);
[DllImport("DLL4k.dll", ExactSpelling = false, EntryPoint = "StartICDMCommand")]
public static extern IntPtr StartICDMCommand(IntPtr pDevice, int nAddress, int nCommand, IntPtr pParameters, int nSizeOfParameter = 0);
[DllImport("DLL4k.dll", EntryPoint = "GetSizeOfData", SetLastError = true, CharSet = CharSet.Auto)]
public static extern int GetSizeOfData(IntPtr pParameters);
[DllImport("DLL4k.dll", EntryPoint = "GetData", SetLastError = true)]
[return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]
public static extern bool GetData(IntPtr pCommand, IntPtr pDataBuffer, int nSize);
[DllImport("DLL4k.dll", SetLastError = true, EntryPoint = "GetCmdResult")]
public static extern int GetCmdResult(IntPtr pCommand);
[DllImport("DLL4k.dll", SetLastError = true, EntryPoint = "EndICDMCommand")]
public static extern void EndICDMCommand(IntPtr pDevice);
[DllImport("DLL4k.dll", SetLastError = true)]
public static extern void RecvEdition(string str);
以上就是c#调用函数一定要是静态的
下面来看看一个列子
public IntPtr hwnd;
StringBuilder sb = new StringBuilder();
public static IntPtr showhwnd = System.Diagnostics.Process.GetCurrentProcess().Handle;
public static IntPtr api = OpenDevice(0, showhwnd);
public IntPtr kk = new IntPtr();
public static int rcount = 0;
StringBuilder sb = new StringBuilder();
public static IntPtr showhwnd = System.Diagnostics.Process.GetCurrentProcess().Handle;
public static IntPtr api = OpenDevice(0, showhwnd);
public IntPtr kk = new IntPtr();
public static int rcount = 0;
以上要是全局变量
最后是下载数据的调用例子
sb.Clear();
sb.AppendFormat("{0}:baud={1},parity=N,data=8,stop=1", cbPort.Text, cbRate.Text);
int count = 0;
if (!IsConnect(api))
{
bool islink = ConnectPort(api, sb);
DMSTATUS dmm = new DMSTATUS();
int sizenewb = Marshal.SizeOf(dmm);
IntPtr buffernew = Marshal.AllocCoTaskMem(sizenewb);
int sizenewa = 0;
try
{
//将托管对象拷贝到非托管内存
SetWaitTime(api, 3000);
Marshal.StructureToPtr(dmm, buffernew, true);
SetAddLog(api, true);
kk = StartICDMCommand(api, 0, (int)CMDWORD.nRecvDMStatus, buffernew, sizenewb);
rcount = GetCmdResult(kk);
if (rcount != 0)
{
sizenewa = GetSizeOfData(kk);
bool isok = GetData(kk, buffernew, sizenewa);
DMSTATUS mm = (DMSTATUS)Marshal.PtrToStructure(buffernew, typeof(DMSTATUS));
count = mm.nRecordCount;
EndICDMCommand(kk);
StringBuilder sbt = new StringBuilder();
int totalcount = 0;
if (count % 100 == 0)
{
totalcount = count / 100;
}
else
{
totalcount = (count / 100) + 1;
}
for (int i = 0; i < totalcount; i++)
{
bool link = ConnectPort(api, sb);
if (link)
{
ATTGUARDRECORD[] Record = new ATTGUARDRECORD[100];
int sizerecord = Marshal.SizeOf(Record[0]);
IntPtr bufferrecord = Marshal.AllocCoTaskMem(sizerecord * 100);
kk = StartICDMCommand(api, 0, (int)CMDWORD.nRecvDelRecord, bufferrecord, sizerecord);
rcount = GetCmdResult(kk);
if (rcount > 0)
{
int sizecount = GetSizeOfData(kk);
GetData(kk, bufferrecord, sizecount);
for (int j = 0; j < 100; j++)
{
Record[j] = (ATTGUARDRECORD)Marshal.PtrToStructure((IntPtr)(bufferrecord + sizerecord * j), typeof(ATTGUARDRECORD));
if (Record[j].nYear > 0)
{
sbt.AppendLine(Record[j].strPersonID + "-" +Record[j].nYear.ToString() + "-" + Record[j].nMonth.ToString() + "-" + Record[j].nDay.ToString() + "-"+ Record[j].nHour.ToString() + ":" + Record[j].nMinute.ToString()+ ":" + Record[j].nSecond.ToString()+ "-" +Record[j].bOnDuty.ToString() + "-" + Record[j].bBC.ToString() + "-" + Record[j].nDMAdr);
}
else
{
continue;
}
}
IntPtr del = new IntPtr();
StartICDMCommand(api, 0, (int)CMDWORD.nRecvDelRecordRlt, del);
}
}
EndICDMCommand(kk);
}
txtcontent.Text = sbt.ToString();
}
}
catch
{
}
sb.AppendFormat("{0}:baud={1},parity=N,data=8,stop=1", cbPort.Text, cbRate.Text);
int count = 0;
if (!IsConnect(api))
{
bool islink = ConnectPort(api, sb);
DMSTATUS dmm = new DMSTATUS();
int sizenewb = Marshal.SizeOf(dmm);
IntPtr buffernew = Marshal.AllocCoTaskMem(sizenewb);
int sizenewa = 0;
try
{
//将托管对象拷贝到非托管内存
SetWaitTime(api, 3000);
Marshal.StructureToPtr(dmm, buffernew, true);
SetAddLog(api, true);
kk = StartICDMCommand(api, 0, (int)CMDWORD.nRecvDMStatus, buffernew, sizenewb);
rcount = GetCmdResult(kk);
if (rcount != 0)
{
sizenewa = GetSizeOfData(kk);
bool isok = GetData(kk, buffernew, sizenewa);
DMSTATUS mm = (DMSTATUS)Marshal.PtrToStructure(buffernew, typeof(DMSTATUS));
count = mm.nRecordCount;
EndICDMCommand(kk);
StringBuilder sbt = new StringBuilder();
int totalcount = 0;
if (count % 100 == 0)
{
totalcount = count / 100;
}
else
{
totalcount = (count / 100) + 1;
}
for (int i = 0; i < totalcount; i++)
{
bool link = ConnectPort(api, sb);
if (link)
{
ATTGUARDRECORD[] Record = new ATTGUARDRECORD[100];
int sizerecord = Marshal.SizeOf(Record[0]);
IntPtr bufferrecord = Marshal.AllocCoTaskMem(sizerecord * 100);
kk = StartICDMCommand(api, 0, (int)CMDWORD.nRecvDelRecord, bufferrecord, sizerecord);
rcount = GetCmdResult(kk);
if (rcount > 0)
{
int sizecount = GetSizeOfData(kk);
GetData(kk, bufferrecord, sizecount);
for (int j = 0; j < 100; j++)
{
Record[j] = (ATTGUARDRECORD)Marshal.PtrToStructure((IntPtr)(bufferrecord + sizerecord * j), typeof(ATTGUARDRECORD));
if (Record[j].nYear > 0)
{
sbt.AppendLine(Record[j].strPersonID + "-" +Record[j].nYear.ToString() + "-" + Record[j].nMonth.ToString() + "-" + Record[j].nDay.ToString() + "-"+ Record[j].nHour.ToString() + ":" + Record[j].nMinute.ToString()+ ":" + Record[j].nSecond.ToString()+ "-" +Record[j].bOnDuty.ToString() + "-" + Record[j].bBC.ToString() + "-" + Record[j].nDMAdr);
}
else
{
continue;
}
}
IntPtr del = new IntPtr();
StartICDMCommand(api, 0, (int)CMDWORD.nRecvDelRecordRlt, del);
}
}
EndICDMCommand(kk);
}
txtcontent.Text = sbt.ToString();
}
}
catch
{
}
}
这样就结束了