我有一个简单的托管C ++程序集,我为C#程序集中的一些静态方法提供了非托管包装器。其中一个方法返回一个字符串,我在C ++程序集中将其转换为“const char *”类型。我遇到的麻烦是,当我从非托管源加载此dll时,我会在指针中返回错误的数据。我该怎么办?我已将我的测试用例简化为:
托管程序集(使用/ clr编译的Test.dll;完整代码如下):
extern "C" {
__declspec(dllexport) const char* GetValue(const char* s) {
return s;
}
}
非托管控制台win32 app:
#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”,也没关系(结果相同)。
答案 0 :(得分:2)
wprintf会将您的第一个参数解释为“const wchar_t *”,而您将“const char *”传递给它。尝试在GetValue函数中使用wchar_t。