Получить char * из DLL

У меня проблема. У меня есть функция в моей DLL, которая определяется как показано ниже:

int function(char *inVal, char *outVal, int *retVal)

Я успешно загружаю свою dll в консольное приложение, используя LoadLibrary, и я вызываю свою функцию с помощью указателя функции:

typedef int (__cdecl *functionPtr)(char *, char *,int *);

Затем я передаю свой InVal для моей функции:

char * inVal = "input";

Теперь я хочу получить свой outVal и retVal, я получил retVal успешно, но мой outVal равен NULL:

int retVal = 0;
char outVal[200] = {0};

тогда я вызываю свою функцию:

int return = functionLNK(inVal , outVal, &retVal)

какая-нибудь подсказка? !!

РЕДАКТИРОВАТЬ 1:

Код как ниже:

int function(char *inVal, char *outVal, int *retVal)

{

PKI_Buf inBuf, signBuf, pemBuf;

......outVal = (char*)pemBuf.data;

//I check outVal in this point and it is not NULL

}

0

Решение

Проблема с function, Вы передаете outVal по значению, что означает, что указатель, который у вас есть внутри функции, является копией того, который вы передали. Затем вы присваиваете этому указателю outVal = (char*)pemBuf.data;, Все, что вы сделали, это изменили копию. Снаружи изменений не происходит.

Это не единственная проблема с вашим подходом. Вы также пытаетесь передать указатель на член объекта, который собирается выйти из области видимости. pemBuf имеет автоматическую продолжительность хранения (потому что это локально function), что означает, что он будет уничтожен, когда вернется. Тогда ваш указатель будет указывать на недопустимый объект.

Вместо этого вам нужно скопировать содержимое pemBuf.data к элементам массива, на которые указывает outVal, Вы можете сделать это с std::copy или же strcpy, Тем не менее, у вас есть еще одна проблема — вы не передаете размер буфера (и я не знаю размер pemBuf.data массив). Предполагая, что вы знаете, сколько копировать как NОднако вы могли бы сделать:

std::copy(pemBuf.data, pemBuf.data + N, outVal);

Тем не менее, ваш код очень похож на C — используются строки в стиле C, выходные параметры и так далее. Я рекомендую вам начать использовать std::string,

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]