У меня есть DLL, которую я написал с помощью C++. Я загружаю эту DLL в другой проект C++ (консоль) во время выполнения с помощью LoadLibrary()
, а затем получаю доступ к функции в DLL с помощью GetProcAddress()
.
Вот код DLL:
SHARED_CLASS string hill(string inmode, string inkey, string xinpassword, string outpword);
И вот как я загружаю и вызываю функцию:
typedef string(_cdecl* MYPROC)(string inmode, string inkey, string xinpassword, string outpword);
HMODULE hInst = LoadLibrary(TEXT("Cipher.dll"));
MYPROC ProcAdd;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;
if (hInst == NULL)
{
cout << "NOT LOADED";
cout << "\n";
}
else
{
cout << "LOADED";
cout << "\n";
ProcAdd = (MYPROC)GetProcAddress(hInst, "hill");
if (NULL != ProcAdd)
{
fRunTimeLinkSuccess = TRUE;
passwordmew = (ProcAdd)("-e", "xxxxxx", "lcgoanhoehfogjdclkmdmlmb", passwordmew);
}
else
{
DWORD dwError = 0;
dwError = GetLastError();
}
}
У меня нет проблем с загрузкой и вызовом функции (она вызывает правильную функцию), проблема возникает при передаче параметров функции, значение, которое передается функции, не совпадает со значением, когда я вызывал функция.
Внутри функции DLL у меня есть это условие. Если вы видите в моем коде, когда я вызывал функцию, которую я передал "-e"
для первого параметра, якобы она должна попасть в условие if
, но вместо этого она попадает в условие else
. Я отладил его и обнаружил, что это одинаково для всех значений параметров.
if (inmode == "-e")
{
//it should go here
}
else
{
//instead it goes here
}
Передаваемые значения выглядят как массив или что-то в этом роде:
Есть идеи, почему?
std::string
всегда используетchar
, а набор символов влияет на макросы winapi. Я больше думал о вариантах отладки и оптимизации. Если вы, например, не соответствуете отладке и выпуску наstd::string
с другим размером отладки и выпуска, то несоответствующий размер будет выделен для параметров, и данные внутри могут быть интерпретированы совершенно неправильно. - person chris   schedule 07.10.2020string x[100
] — это либо 100 объектовstd::string
(!!), либо 100 байт строки CS50. Что это здесь? Вот почемуusing namespace std
вызывает проблемы, и его следует по возможности избегать. - person tadman   schedule 07.10.2020char*
в стиле C. - person Remy Lebeau   schedule 07.10.2020