C 高階與初心 (二)P Invoke平台呼叫

2022-03-03 23:07:31 字數 902 閱讀 6437

最近某個專案要採集交易終端的資訊用於監管,主要廠商給出了api,c++版的。。。開啟hard模式!!!

c#呼叫c++的dll基本就兩種方法:加乙個vc++專案包一層,或者使用p/invoke(平台呼叫)。前者對於純c#的客戶端來說,增加了複雜性。那就只剩下平台呼叫了。使用平台呼叫的過程比較艱辛,主要遇到了兩個問題:1、呼叫方式callingconvention;2、引數型別;

呼叫方式預設貌似stdcall,如果呼叫windows api,可以不寫;但是對於c風格的,呵呵,得寫成cdecl。如果沒寫的話 ,內心肯定是崩潰的。。。為什麼結果總是不對!!!

好日子過久了,就吃不了苦啦。。。在.net框架下,基礎資料型別的使用隨手拈來,從來不會發生不知道怎麼用的情況:數字就int,字串就string,考究一點考慮考慮long和stringbuilder。一弄平台呼叫,傻眼了,這該用啥資料型別呢?!

函式的原型是getsysteminfo(char* psysteminfo, int& nlen),後乙個引數知道是要傳入乙個ref int,前乙個呢?同事告訴我可以使用string,但是問題是,需要傳出([out]),字串都是不可更改的。谷歌一下,有說可以stringbuilder的,試試貌似好使(後來看到learning hard以及微軟自己的文件,stringbuilder確實可以)。

但又遇到了問題——其中一家的api取出的字串比len更長的部分是亂碼(後來想其實可以截斷)?!我司一位c++大佬給了條明路,可以使用byte,試試,中!這才落定。

後來看了很多部落格和微軟的文件,資料封送(支援平台呼叫和com)是一門技術,光說明都很多頁。主要的內容是資料封送拆收器(marshaler),對於資料在託管記憶體和非託管記憶體中的傳遞。圖示如下:

C語言 陣列與指標高階(二)

c語言中能否靈活應用指標就能看出你的c語言功底如何,接下來是我對在學習指標過程中,對一下較為苦澀概念的理解及總結。指標的運算可歸納為以下三部分 1 指標 整數 一般來說,此類運算只是左右移動指標所指向陣列元素的位置而已 若指標指向的是 陣列名,此時其加1,則移動的是乙個陣列了,不是乙個元素 2 指標...

C高階作業二

1.乙個陣列中只有兩個數字是出現一次,其他所有數字都出現了兩次。找出這兩個只出現一次的數字,程式設計實現。void findnum int src,int n int pnum1,int pnum2 int pos 0 for pos 0 sum 1 pos pos int num1 0 int n...

C高階習題二

看更多乾貨,獲取第一時間更新 1.實現庫函式 atoi 2.單身狗問題 乙個陣列中只有兩個數字是出現一次,其他所有數字都出現了兩次。編寫乙個函式找出這兩個只出現一次的數字。乙個陣列中只有乙個數字是出現一次,其他所有數字都出現了兩次。編寫乙個函式找出這兩個只出現一次的數字。3.實現 strncat s...