C ++ DLL символьные параметры

0

Я хочу назвать эту функцию c++ программой C. Я хочу использовать char * errorMessage, чтобы вернуть сообщение об ошибке. Когда я возвращаю errorMessage в код, я получаю указатель char в моем приложении C после возврата. Но если я пытаюсь errorMessage = SafeStringHeap(string("File name was empty.")); Я всегда получаю Null Pointer в своем приложении C.

Я попытался вызвать свою функцию со следующим текстом в приложении c:

char* errorMessage = NULL;
TAFMessage = (*TAFParseMessageFile)(NULL, errorMessage);

Функции:

static char* SafeStringHeap(string message)
{
    //Save string on the heap
    char * cstr = new char[message.length() + 1];
    strcpy_s(cstr, message.length() + 1, message.c_str());

    return cstr;
}

extern "C" __declspec(dllexport) const char* TAFParseMessageFile(const char* fileName, char* errorMessage)
{
    if (fileName == NULL)
    {
        errorMessage = SafeStringHeap(string("File name was empty."));
        return errorMessage;
    }

    return NULL;    // TODO: set errorMessage
}
  • 1
    Почему вы передаете сообщение об ошибке? Как вы думаете, что произойдет с памятью, выделенной в вашей функции SafeStringHeap? Кто освободит это? И когда? Может быть, лучше передать реальный массив символов, чтобы вы могли записать в него свое сообщение об ошибке?
  • 0
    Вы имеете в виду следующее: char errorMessage [100]; TAFMessage = (* TAFParseMessageFile) (NULL, errorMessage);
Теги:
string
dll

1 ответ

1
Лучший ответ

С учетом других проблем, поднятых выше. Попробуйте изменить аргумент errorMessage на char ** (указатель на указатель char), а затем выполните:

*errorMessage = SafeStringHeap(...)

И при вызове функции pass & errorMessage

  • 0
    Привет, спасибо за помощь. Почему это работает с двумя указателями?
  • 1
    Потому что, когда вам захочется манипулировать значением аргумента, т. Е. Использовать его как переменную OUT, вам необходимо добавить дополнительный уровень косвенности. Например, вызов функции с использованием типа int, если вы хотите, чтобы функция проецировала манипуляции с аргументом int обратно вызывающей стороне, то вы должны передать адрес этого int, чтобы рабочая функция могла разместить новое значение в заполнитель вызывающего абонента для этого аргумента.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню