Явное связывание DLL с LoadLibrary и 2 DLL в переполнении стека

это мой первый пост в stackoverflow, и я начинаю с проблемы.

Я пишу приложение графического интерфейса с Qt в C ++.
На данный момент я застрял на загрузке и сохранении DLL, которые были переданы мне.
Для загрузки и сохранения я решил установить функции для задач загрузки и сохранения. Но главная проблема заключается в загрузке различных файлов DLL.

У меня есть следующий код для загрузки и сохранения, но я получаю ошибки, когда я переключаюсь с загрузки на сохранение. я знаю, что это как-то связано с функцией «FreeLibrary ()». Но в случае выполнения FreeLibrary (hDLLimp) я не могу повторить загрузку моего «implib.dll». Возвращенный hDLLimp равен 0.
Если я закомментирую FreeLibrary, функция загрузки может быть выполнена повторно несколько раз. Но функция сохранения не работает. hDLLexp становится «0» и дескриптор исчез.


    // Load function

HINSTANCE         hDLLimp = 0;
GETCOUNTS         fncgetcounts;
GETITEM           fncgetitem;
IMPEXPINTERFACE   fncimportinterface;
TProcLib          *proclib;
TNativeSurface    nativesurface;
char              filepath[_MAX_PATH];

hDLLimp = LoadLibrary(TEXT("implib.dll"));
DWORD Error = GetLastError();
if( hDLLimp == 0 )
{
QMessageBox *msgBox = new QMessageBox;
msgBox->setText("implib.dll konnte nicht geladen werden");
msgBox->exec();
return;
}

fncgetcounts = (GETCOUNTS) GetProcAddress(hDLLimp, "GetCounts");
fncgetitem = (GETITEM) GetProcAddress(hDLLimp, "GetItem");
fncimportinterface = (IMPEXPINTERFACE) GetProcAddress(hDLLimp, "ImportInterface");

for (long i=0; i<fncgetcounts()-1; i++) {
if ((proclib = fncgetitem(i))==NULL) break;
if (strcmp(proclib->ResName, "SDFIMPORT")==0) {
strcpy(filepath, "test.sdf");
fncimportinterface(filepath, _MAX_PATH, &(proclib->PrgId), 2, &nativesurface, 0, 0, NULL, NULL, 1);
break;
}
}
//FreeLibrary(hDLLimp);

    //Export/Save function

HINSTANCE         hDLLexp = 0;

GETCOUNTS         fncgetcounts;

GETITEM           fncgetitem;

IMPEXPINTERFACE   fncexportinterface;

TProcLib          *proclib;

TNativeSurface    nativesurface;

char              filepath[_MAX_PATH];

hDLLexp = LoadLibrary(TEXT("explib.dll"));
if( hDLLexp == 0 )
{
QMessageBox *msgBox = new QMessageBox;
msgBox->setText("explib.dll konnte nicht geladen werden");
msgBox->exec();
return;
}

fncgetcounts = (GETCOUNTS) GetProcAddress(hDLLexp, "GetCounts");
fncgetitem = (GETITEM) GetProcAddress(hDLLexp, "GetItem");
fncexportinterface = (IMPEXPINTERFACE) GetProcAddress(hDLLexp, "ExportInterface");

for (long i=0; i<fncgetcounts()-1; i++) {
if ((proclib = fncgetitem(i))==NULL) break;
if (strcmp(proclib->ResName, "SDFEXPORT")==0) {
strcpy(filepath, "test.sdf");
fncexportinterface(filepath, _MAX_PATH, &(proclib->PrgId), 2, &nativesurface, 0, 0, NULL, NULL, 1);
break;
}
}
//FreeLibrary(hDLLexp);

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]