Вызов функции С++ из DLL через GetProcAddress не передает правильное значение параметра

У меня есть 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
}

Передаваемые значения выглядят как массив или что-то в этом роде:

Снимок экрана во время отладки

Есть идеи, почему?


person Ken    schedule 07.10.2020    source источник
comment
Можете ли вы сказать нам, какое значение приходит вместо -e ?   -  person Jerry Jeremiah    schedule 07.10.2020
comment
Используете ли вы один и тот же компилятор и параметры для их создания?   -  person chris    schedule 07.10.2020
comment
Я редактирую свой пост, чтобы добавить скриншот значения, которое передается функции. Да, я использую один и тот же компилятор для двух проектов. Это как-то связано с набором символов?   -  person Ken    schedule 07.10.2020
comment
Если вы имеете в виду вариант, который, я думаю, вы имеете в виду, набор символов не будет иметь значения, потому что std::string всегда использует char, а набор символов влияет на макросы winapi. Я больше думал о вариантах отладки и оптимизации. Если вы, например, не соответствуете отладке и выпуску на std::string с другим размером отладки и выпуска, то несоответствующий размер будет выделен для параметров, и данные внутри могут быть интерпретированы совершенно неправильно.   -  person chris    schedule 07.10.2020
comment
string x[100] — это либо 100 объектов std::string (!!), либо 100 байт строки CS50. Что это здесь? Вот почему using namespace std вызывает проблемы, и его следует по возможности избегать.   -  person tadman    schedule 07.10.2020
comment
Типы None-POD, такие как std::string, просто небезопасно передавать через границу DLL, даже если вы используете один и тот же компилятор и настройки как для приложения, так и для DLL. Используйте только переносимые типы POD, такие как строки char* в стиле C.   -  person Remy Lebeau    schedule 07.10.2020
comment
Вы правы, @chris, я использовал выпускную версию DLL и запускал консольное приложение в режиме отладки, после использования отладочной версии DLL все прошло отлично. Пожалуйста, поместите свой комментарий в качестве ответа, чтобы я мог отметить его как ответ на этот вопрос. Спасибо за помощь!   -  person Ken    schedule 07.10.2020
comment
@RemyLebeau, хотя я, безусловно, рекомендовал бы это, означает ли это, что ответы в обмане неверны, чтобы квалифицировать это как нормальное используя тот же компилятор+параметры+среда выполнения? Мои знания DLL еще недостаточно полны. Или, возможно, есть разница между передачей по значению и ссылке, которая влияет на эти квалификации?   -  person chris    schedule 07.10.2020
comment
@chris, безусловно, можно заставить это работать в данной ситуации с нужным объемом работы, но это сильно ограничивает переносимость даже для новых версий / конфигураций того же компилятора. Это просто не стоит риска.   -  person Remy Lebeau    schedule 07.10.2020
comment
@RemyLebeau, понятно, спасибо.   -  person chris    schedule 07.10.2020