今天想在vs2010下使用c#的winform呼叫,vs2010編寫的c++動態鏈結庫dll,但是總是提示找不到入口函式。呼叫方法如下:
[dllimport("examsafe.dll"]
public static extern long poplanguagebar(ref long result);
該函式的功能是彈出輸入法提示欄。
poplanguagebar在c++ 中是乙個虛函式 ,需要重寫,開始以為是虛函式的問題,後來各種查資料得出的結論不是這個原因。
那麼就應該是在c++裡面的匯出標識c#不認。
檢視c++標頭檔案裡面的函式定義如下:
stdmethod(poplanguagebar)(long* result);
stdmethod 展開就是 virtual __declspec(nothrow) long __stdcall
那麼這種匯出標識肯定有一環是c#不識別的。
通過各種修改,各種嘗試後,果斷放棄在類裡面去修改匯出標識,乾脆重新寫了乙個純c函式
函式定義如下
extern "c" __declspec(dllexport) long poplanguagebar(long* result){}
並用在c#中匯入時,需要新增引數callingconvention = callingconvention.cdecl
具體匯入格式是
[dllimport("examsafe.dll", charset = charset.auto, callingconvention = callingconvention.cdecl)]
public static extern long poplanguagebar(ref long result);
直接搞定收工。
其中原因是在vs2010下,要想呼叫c++所寫的dll ,還需要在c++中將函式宣告為extern "c" __declspec(dllexport)格式,c# 才能識別。弄了半個下午。。。。
windows安裝IIS不成功的原因
一 背景 之前做過一段時間的實施,因此總結一下iis安裝不成功會有哪些原因導致的,希望給踩坑的人提供思路和幫助。二 分析原因 1.系統問題,比如windows家庭版本 獨白 我之前花了一天的時間安裝iis,都不成功,當時奔潰了,最後在朋友指導發現win10的家庭版本的系統導致原因,當時我的內心噴一口...
C 呼叫C 寫的DLL
方法有不少,這裡記錄其中的乙個方法。編譯 呼叫通過了的。期間遇到的問題是c 呼叫時傳遞string型別的引數和返回值會報錯。targetinvocationexception異常,值不在範圍內,記憶體不可訪問等等。解決方法是 在c 的dll中將string型別的引數返回值改為lptstr型別。在c ...
C 呼叫Delphi寫的DLL
在c 中可以這樣呼叫 呼叫 這裡需要注意的是要外傳的pchar型別引數,在c 中對應使用stringbuilder,如果使用string沒有任何資訊傳出,如果使用ref string形式,則會出現記憶體錯誤。在c 中可以這樣呼叫 呼叫 經過測試 delphi中integer的引數使用c 中的int即...