//先道個歉,只有85分了,很久不來了。
//以下是C++頭檔案
//回呼函式定義;每個回呼函式既是回傳的一個事件點。
typedef struct {
//命令發送成功,目標設備有回應。
void (*PTK_UserCommandSuccessful)(const void* sender, uint receid, uchar hostid, uchar terid, uchar commandcode);
//命令發送失敗,目標設備無回應。
void (*PTK_UserCommandDelete)(const void* sender, uint receid, uchar hostid, uchar terid, uchar commandcode);
//報警資訊
void (*PTK_Alarm_Information)(const void* sender, uint receid, uchar hostid, uchar terid, uchar areaid, EPTK_Alarm_Event Eventcode);
// 鍵盤顯示 需主機為V3.3以上版本才有回應
void (*PTK_Alarm_KpdDisplay)(const void* sender, uint receid, uchar hostid, uchar* Dis1, uchar* Dis2);
}SPTK_callbackFun;
//DLL初始化函式:完成記憶體分配,執行緒開啟等操作,獲取相應的充分的系統資源。
PTKALARMLIB_API void* Init_PTKAlarmlib(const void* sender, SPTK_callbackFun* CallBack);
@版主
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
目前C#代碼是這樣寫的,可是行不通。x86也設定了。//回呼函式定義;每個回呼函式既是回傳的一個事件點。
[StructLayout( LayoutKind.Sequential )]
public struct SPTK_callbackFun {
[DllImport( "AlarmSDK.dll", EntryPoint = "PTK_UserCommandSuccessful", CallingConvention = CallingConvention.StdCall )]
public static extern IntPtr PTK_UserCommandSuccessful( ref byte sender, System.UInt16 receid, int hostid, int terid, int commandcode );
[DllImport( "AlarmSDK.dll", EntryPoint = "PTK_UserCommandDelete", CallingConvention = CallingConvention.StdCall )]
public static extern IntPtr PTK_UserCommandDelete( ref byte sender, System.UInt16 receid, int hostid, int terid, int commandcode );
[DllImport( "AlarmSDK.dll", EntryPoint = "PTK_Alarm_Information", CallingConvention = CallingConvention.StdCall )]
public static extern IntPtr PTK_Alarm_Information( ref byte sender, System.UInt16 receid, int hostid, int terid, int areaid, EPTK_Alarm_Event Eventcode );
[DllImport( "AlarmSDK.dll", EntryPoint = "PTK_Alarm_KpdDisplay", CallingConvention = CallingConvention.StdCall )]
public static extern IntPtr PTK_Alarm_KpdDisplay( ref byte sender, System.UInt16 receid, int hostid, int Dis1, int Dis2 );
}
//PTKALARMLIB_API void* Init_PTKAlarmlib(const void* sender, SPTK_callbackFun* CallBack);
[DllImport( "AlarmSDK.dll", EntryPoint = "Init_PTKAlarmlib", CallingConvention = CallingConvention.StdCall )]
public static extern IntPtr P_Client_QueryRecord( ref byte zero, ref SPTK_callbackFun pInfo );
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
你的定義看起來好多都不對。首先,uint和uchar你需要查看檔案中是如何定義的,這樣子才是能確定對應的型別,單單從名稱來看像是無符號32和無符號8。
其次,結構體里面是回呼函式,對應的應該是委托。
應該是像這個樣子
//這里假定
//uint = unsigned int = 無符號32 = C# uint
//uchar = unsigned char = 無符號8 = C# byte
//實際你需要根據C++檔案的實際定義查看然后轉成對應的C#型別
public delegate void _PTK_UserCommandSuccessful(System.IntPrt sender,uint receid, byte hostid, byte terid, byte commandcode);
//其余省略...
[StructLayout( LayoutKind.Sequential )]
public struct SPTK_callbackFun {
public _PTK_UserCommandSuccessful PTK_UserCommandSuccessful;
//其余省略...
}

uj5u.com熱心網友回復:
1.基本型別要正確對應2. StructLayout特性支持三種附加欄位:CharSet、Pack、Size
需要顯示定義,任何一項不對應都會導致錯誤
3.回呼函式需要用委托來對應
uj5u.com熱心網友回復:
資料型別的是結構體的我沒有試過,你這邊的C++代碼的資料型別結構體,C#這邊傳入也應該是結構體,而且你C++這邊有不定性的指標,需要把C++的代碼貼出來才能決定C#這邊該如何傳入資料uj5u.com熱心網友回復:
報警資訊的沒轉換,其他幾個轉換了一下
/// Return Type: void
///sender: void*
///receid: int
///hostid: char
///terid: char
///commandcode: char
public delegate void _PTK_UserCommandSuccessful(System.IntPtr sender, int receid, byte hostid, byte terid, byte commandcode);
/// Return Type: void
///sender: void*
///receid: int
///hostid: char
///terid: char
///commandcode: char
public delegate void _PTK_UserCommandDelete(System.IntPtr sender, int receid, byte hostid, byte terid, byte commandcode);
/// Return Type: void
///sender: void*
///receid: int
///hostid: char
///Dis1: char*
///Dis2: char*
public delegate void _PTK_Alarm_KpdDisplay(System.IntPtr sender, int receid, byte hostid, System.IntPtr Dis1, System.IntPtr Dis2);
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct SPTK_callbackFun {
/// _PTK_UserCommandSuccessful
public _PTK_UserCommandSuccessful AnonymousMember1;
/// _PTK_UserCommandDelete
public _PTK_UserCommandDelete AnonymousMember2;
/// _PTK_Alarm_KpdDisplay
public _PTK_Alarm_KpdDisplay AnonymousMember3;
}
public partial class NativeMethods {
/// Return Type: void*
///sender: void*
///CallBack: SPTK_callbackFun*
[System.Runtime.InteropServices.DllImportAttribute("<Unknown>", EntryPoint="Init_PTKAlarmlib")]
public static extern System.IntPtr Init_PTKAlarmlib(System.IntPtr sender, ref SPTK_callbackFun CallBack) ;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/32844.html
標籤:C#
