Извикването на C++ функция от 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 типове, като C-style char* низове.   -  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