最近想練習用wpf寫介面,呼叫api的時候發現太麻煩,每個引數要自己宣告型別,於是準備寫乙個dll,在dll裡面呼叫api,將結果返回(字串)。
先上dll函式,
wchar_t* geterrorcodestr(dword dwerror)
}if (fok && (hlocal != null))
return buff;
}
就是乙個簡單的把getlasterror的返回值轉換為字串的函式。
然後c#中宣告:
[dllimport("control.dll", entrypoint = "geterrorcodestr", charset = charset.unicode, callingconvention = callingconvention.winapi)]
public
static
extern intptr geterrorcodestr(int errorcode);
為什麼這裡函式返回值就寫intptr而不是string呢,我剛開始也是這麼認為的,但是呼叫的時候會提示堆疊損壞。。。
在翻了很多部落格後,了解到對於c/c++的指標,都要用intprt。
然後就是呼叫函式:
intptr i = geterrorcodestr(errorcode);
string temp = marshal.ptrtostringuni(i, 1024).split('\r')[0];
然後temp裡面就是返回的結果了。
能看到我在獲得字串後,將字串分片,然後選擇了第乙個字串。
因為marshal.ptrtostringuni函式是從非託管記憶體複製指定數量的字元,我這裡設定1024(dll裡面分配的wchar_t陣列也是1024),就導致結果變成了這樣:
dll裡面的返回內容:
marshal.ptrtostringuni(i, 1024)的結果:
真的複製了1024個字元,裡面有很多我們不需要的字元,就需要分片後才能拿到我們真正需要的東西。
c 返回值為引用
與返回原值的區別 return的位址和返回值的位址是同乙個,也就是佔據著同一塊記憶體,因此要求此時return的東西必須是乙個實體 有儲存位址 不能是乙個作用域僅在函式中的區域性變數 例如 int fun a fun 就會報錯。因為a找不到它應該存在的位址在 int fun int c a fun ...
C 獲取IPCONFIG 返回值
在我們獲取本機區域網ip以及其他相關資訊時,直接呼叫系統ipconfig,也是一種很有效的方法。以下是我用c 實現的 讀取ipconfig的返回值的 獲取ipconfig返回值 返回 ipconfig輸出 public static string getipconfigreturns return ...
C C 程式設計 獲取執行緒的返回值
1 在主線程中建立std promise物件 std promise int promiseobj 上面定義的promise物件還沒有任何關聯的值。但是它承諾某個執行緒將會設定與其關聯的值,並且,當值被設定以後,可以通過與promise關聯的std future物件來獲取該值。假設我們的主線程將建立...