2010-03-04 6 views
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"를 지정했는지 여부는 중요하지 않습니다 (동일한 결과). 당신이 그것을에 "CONST의 char *"를 전달하는 동안 % s 형식 지정자와

답변

2

wprintf는 "CONST의 wchar_t의 *"로 첫 번째 매개 변수를 해석합니다. GetValue 함수에서 wchar_t를 사용해보십시오.

+1

그래, 유니 코드 인 것처럼 8 비트 문자열을 인쇄하고 있습니다. 그것은 중국어를 생산합니다. wprintf() 대신 printf()를 사용하는 것은 간단한 해결책입니다. % s 대신 % hs를 사용하는 것은 또 다른 저렴한 트릭입니다. –

관련 문제