У меня проблема. У меня есть функция в моей 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
}
Проблема с 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
,
Других решений пока нет …