1
我有一個簡單的託管C++程序集,我爲C#程序集中的一些靜態方法提供非託管包裝。其中一個方法返回一個字符串,我已經在C++程序集中轉換爲「const char *」類型。我遇到的麻煩是,當我從非託管源加載此dll時,我將錯誤的數據返回到指針中。我能做些什麼呢?我簡化了我的測試用例到這一點:如何從clr程序集中返回char *數組?
管理組件(Test.dll的編譯/ CLR,完整的代碼如下):
extern "C" {
__declspec(dllexport) const char* GetValue(const char* s) {
return s;
}
}
非管理控制檯的Win32應用程序:
#include "stdafx.h"
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
typedef const char* (*GetValueFunc)(const char* s);
int _tmain(int argc, _TCHAR* argv[]) {
wprintf(L"Hello from unmanaged code\n");
HMODULE hDll = LoadLibrary(L"Test.dll");
if (!hDll)
return GetLastError();
wprintf(L"library found and loaded\n");
GetValueFunc getValue = (GetValueFunc)GetProcAddress(hDll, "GetValue");
if(!getValue)
return GetLastError();
wprintf(L"%s\n", getValue("asdf"));
return 0;
}
我得到前兩行很好,但出來的第三行是垃圾。如果我讓dll在cpp文件的頂部有「#pragma unmanaged」也沒關係(相同的結果)。
是的,你正在打印一個8位字符串,就好像它是Unicode。這產生中文。使用printf()而不是wprintf()是一個簡單的解決方案。使用%hs而不是%s是另一個便宜的技巧。 –