Имам 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
] е или 100std::string
обекта (!!) или 100 байта CS50 низ. Кое е тук? Ето защоusing namespace std
причинява проблеми и трябва да се избягва, когато е възможно. - person tadman   schedule 07.10.2020char*
низове. - person Remy Lebeau   schedule 07.10.2020