C 獲取C C 返回值為wchar t 的內容

2021-08-01 09:43:33 字數 1232 閱讀 3532

最近想練習用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物件來獲取該值。假設我們的主線程將建立...