Как мне вернуть массив char * из сборки clr? - PullRequest
1 голос
/ 05 марта 2010

У меня есть простая управляемая сборка C ++, в которой я предоставляю неуправляемые оболочки для некоторых статических методов, которые есть в сборке C #. Один из этих методов возвращает строку, которую я преобразовал в тип const char * в сборке C ++. Проблема у меня в том, что когда я загружаю эту dll из неуправляемого источника, я получаю неверные данные обратно в указатель. Что я могу сделать по этому поводу? Я упростил свой тестовый пример до этого:

управляемая сборка (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 иметь «#pragma unmanaged» в верхней части файла cpp или нет (те же результаты).

1 Ответ

2 голосов
/ 05 марта 2010

wprintf со спецификатором формата% s будет интерпретировать ваш первый параметр как «const wchar_t *», в то время как вы передаете ему «const char *». Попробуйте использовать wchar_t в вашей функции GetValue.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...