導航:首頁 > 編程語言 > python動態傳參

python動態傳參

發布時間:2025-06-24 02:46:31

『壹』 請教python調用dll動態庫的傳參問題

第一步,我先從簡單的調用出發,定義了一個簡單的函數,該函數僅僅實現一個整數加法求和: LIBEXPORT_API int mySum(int a,int b){ return a+b;} C# 導入定義: public class RefComm { [DllImport("LibEncrypt.dll", EntryPoint=" mySum ", CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)] public static extern int mySum (int a,int b); } 在C#中調用測試: int iSum = RefComm.mySum(,); 運行查看結果iSum為5,調用正確。第一步試驗完成,說明在C#中能夠調用自定義的動態鏈接庫函數。 第二步,我定義了字元串操作的函數(簡單起見,還是採用前面的函數名),返回結果為字元串: LIBEXPORT_API char *mySum(char *a,char *b){sprintf(b,"%s",a); return a;} C# 導入定義: public class RefComm { [DllImport("LibEncrypt.dll", EntryPoint=" mySum ", CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)] public static extern string mySum (string a, string b); } 在C#中調用測試: string strDest=""; string strTmp= RefComm.mySum("45", strDest); 運行查看結果 strTmp 為"45",但是strDest為空。我修改動態鏈接庫實現,返回結果為串b: LIBEXPORT_API char *mySum(char *a,char *b){sprintf(b,"%s",a) return b;} 修改 C# 導入定義,將串b修改為ref方式: public class RefComm { [DllImport("LibEncrypt.dll", EntryPoint=" mySum ", CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)] public static extern string mySum (string a, ref string b); } 在C#中再調用測試: string strDest=""; string strTmp= RefComm.mySum("45", ref strDest); 運行查看結果 strTmp 和 strDest 均不對,含不可見字元。再修改 C# 導入定義,將CharSet從Auto修改為Ansi: public class RefComm { [DllImport("LibEncrypt.dll", EntryPoint=" mySum ", CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)] public static extern string mySum (string a, string b); } 在C#中再調用測試: string strDest=""; string strTmp= RefComm. mySum("45", ref strDest); 運行查看結果 strTmp 為"45",但是串 strDest 沒有賦值。第二步實現函數返回串,但是在函數出口參數中沒能進行輸出。再次修改 C# 導入定義,將串b修改為引用(ref): public class RefComm { [DllImport("LibEncrypt.dll", EntryPoint=" mySum ", CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)] public static extern string mySum (string a, ref string b); } 運行時調用失敗,不能繼續執行。 第三步,修改動態鏈接庫實現,將b修改為雙重指針: LIBEXPORT_API char *mySum(char *a,char **b){sprintf((*b),"%s",a); return *b;} C#導入定義: public class RefComm { [DllImport("LibEncrypt.dll", EntryPoint=" mySum ", CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)] public static extern string mySum (string a, ref string b); } 在C#中調用測試: string strDest=""; string strTmp= RefComm. mySum("45", ref strDest); 運行查看結果 strTmp 和 strDest 均為"45",調用正確。第三步實現了函數出口參數正確輸出結果。 第四步,修改動態鏈接庫實現,實現整數參數的輸出: LIBEXPORT_API int mySum(int a,int b,int *c){ *c=a+b; return *c;} C#導入的定義: public class RefComm { [DllImport("LibEncrypt.dll", EntryPoint=" mySum ", CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)] public static extern int mySum (int a, int b,ref int c); } 在C#中調用測試: int c=0; int iSum= RefComm. mySum(,, ref c); 運行查看結果iSum 和c均為5,調用正確。 經過以上幾個步驟的試驗,基本掌握了如何定義動態庫函數以及如何在 C# 定義導入,有此基礎,很快我實現了變長加密函數在 C# 中的調用,至此目標實現。 三、結論 在 C# 中調用 C++ 編寫的動態鏈接庫函數,如果需要出口參數輸出,則需要使用指針,對於字元串,則需要使用雙重指針,對於 C# 的導入定義,則需要使用引用(ref)定義。 對於函數返回值,C# 導入定義和 C++ 動態庫函數聲明定義需要保持一致,否則會出現函數調用失敗。定義導入時,一定注意 CharSet 和 CallingConvention 參數,否則導致調用失敗或結果異常。運行時,動態鏈接庫放在 C# 程序的目錄下即可,我這里是一個 C# 的動態鏈接庫,兩個動態鏈接庫就在同一個目錄下運行。

閱讀全文

與python動態傳參相關的資料

熱點內容
pdf復制到word亂碼 瀏覽:234
python動態傳參 瀏覽:388
python雜記完整視頻 瀏覽:124
小鹿有約app在哪裡下載 瀏覽:869
e盾山寨源碼 瀏覽:765
手機音樂播放器源碼 瀏覽:474
androidsdk下載更新 瀏覽:625
python讀入多個文件 瀏覽:411
現在哪個app能交朋友 瀏覽:987
多空博士指標源碼 瀏覽:545
程序員考編制關注的公眾號 瀏覽:789
大湯PDF 瀏覽:941
寫給大家看的pdf 瀏覽:355
開福區電腦編程培訓 瀏覽:765
長安悅翔v7的壓縮比是多少 瀏覽:783
russian4如何更換伺服器 瀏覽:264
linux對ip限速 瀏覽:900
貓和老鼠程序員視頻 瀏覽:40
解壓之後自動運行批處理 瀏覽:636
子宮肌瘤手術前吃什麼解壓葯好 瀏覽:301