C#調用C++動態庫接口函數和回調函數方法 後續

聲明回調委託,C#的委託可以實現C#調用C++的回調,操作函數以後的回調

//定義委託,CallingConvention.StdCall可以,CallingConvention.Cdecl不行,參考https://www.it1352.com/1792610.html
 //[UnmanagedFunctionPointer(CallingConvention.Cdecl)] //不需要要添加該句話,具體參考 //https://blog.csdn.net/weixin_30786657/article/details/98678227
 public delegate int CallBackGWQStartSWithRec(int ErrorCode, string SignPdfBase64, string SignNameBase64, string FingerPrintBase64, string XML, string endTime);

注意

其中WINAPI也稱爲StdCall不像大多數C / C ++庫通常使用的Cdecl。CallingConvention默認是CallingConvention.StdCall

動態庫聲明

public class GWQDllHidDevice
    {
        [DllImport("GWQDll.dll", EntryPoint = "GWQ_StartSWithRec")]
        public extern static int GWQ_StartSWithRec(string PDFPath, int SignType, string Location, string VideoPath, int Timeout, int FPWidth, int SignWidth, CallBackGWQStartSWithRec Q_StartSignWithRec, byte[] VoiceText, int VoiceTextLen);
    }

 

使用

public class  GWQDevice {
 public static int CallBackSWithRec(int ErrorCode, string SPdfBase64, string SNameBase64, string FPBase64, string XML, string endTime)
        {
//處理回調內容
try { if (ErrorCode == 0) { if (!string.IsNullOrEmpty(SPdfBase64)) { var bytes = Convert.FromBase64String(SPdfBase64); using (FileStream fs = new FileStream("signPDFmerge.pdf", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite)) { fs.Write(bytes, 0, bytes.Length); Console.WriteLine("sPDFmerge.pdf 寫入當前目錄"); } var spdfBase64 = SPdfBase64; } } } catch (Exception ex) { logger.Error($"操作以後回調失敗,原因:{ex}"); }return ErrorCode; } public int GWQStartSignWithRecAsync(string PDFPath, string Location, string VideoPath, int Timeout, int FPWidth, int SignWidth, string VoiceText, int SignType = 1) { int ret = 0; try { byte[] VoiceTextbyte = null; if (string.IsNullOrWhiteSpace(VoiceText)) { VoiceTextbyte = default;// new byte[]; } else { VoiceTextbyte = Encoding.GetEncoding("GB18030").GetBytes(VoiceText); } CallBackGWQStartSWithRec Q_StartSWithRec = new CallBackGWQStartSWithRec(CallBackSWithRec); ret = GWQDllHidDevice.GWQ_StartSWithRec(PDFPath, SignType, Location, VideoPath, Timeout, FPWidth, SignWidth, Q_StartSWithRec, VoiceTextbyte, VoiceTextbyte.Length); } catch { } finally { //Finished(); } return ret; } }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章