Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Loadlibrary не подгружает dll при отладке


Автор: becks 30.1.2012, 16:32
Добрый день, коллеги. Опишу ситуацию: есть dll (назовем ее t.dll), созданная в VS 2008, она экспортирует одну функцию:

Код

extern "C" int __declspec(dllexport) GetFactsFromText (const char* inp_file, const char* out_file, const char* config_file );
 

Библиотека t.dll использую в проекте на С++, созданном в RAD XE, библиотека подключается следующим образом (проверки убрал ради экономия места):

Facts.h
Код

//---------------------------------------------------------------------------
// Объявление типа указателя на DLL
HINSTANCE dllInstance;
//---------------------------------------------------------------------------
// Объявление типа указателя на функцию
typedef int ( __declspec( dllimport ) * GetFactsFromTextType (const char* inp_file,const char* out_file, const char* config_file));
GetFactsFromTextType * GetFactsFromText ;


// main.cpp
Код

#include "Facts.h"
.....
void __fastcall TmainForm::FormCreate(TObject *Sender)
{
    LPCTSTR dllname = _T("t.dll");
    dllInstance = LoadLibrary (dllname);
    GetFactsFromText = (GetFactsFromTextType *) GetProcAddress(dllInstance, "GetFactsFromText");
}
 

И вот тут возникает 2 вопроса:

1) LoadLibrary НЕ подгружает библиотеку во время отладки и подгружает во время обычного исполнения модуля.
2) Если функция GetFactsFromText вызывается в модуле main.cpp, то отлично отрабатывается, если в каком либо другом, то ее адрес = 0, хотя в модуле есть:

Некоторый_модуль.cpp
Код

extern GetFactsFromTextType * GetFactsFromText;


Буду очень благодарен за помощь. Спасибо.

Добавлено через 3 минуты и 39 секунд
Забыл написать, GetLastError() , вызванный сразу после LoadLibrary, возвращает 3221225622.  smile 

Автор: Dem_max 30.1.2012, 16:43
Цитата

1) LoadLibrary НЕ подгружает библиотеку во время отладки и подгружает во время обычного исполнения модуля.

Как то невероятно.

Цитата

2) Если функция GetFactsFromText вызывается в модуле main.cpp, то отлично отрабатывается, если в каком либо другом, то ее адрес = 0, хотя в модуле есть:

Значит это какая то другая функция в другом модуле. 

Автор: becks 30.1.2012, 16:58
Цитата

Как то невероятно.


Сам в шоке, без шуток.


Цитата

Значит это какая то другая функция в другом модуле. 
 

Только что еще раз проверил, больше никаких объявлений нет.

Автор: feodorv 31.1.2012, 00:28
Цитата(becks @  30.1.2012,  16:32 Найти цитируемый пост)
Забыл написать, GetLastError() , вызванный сразу после LoadLibrary, возвращает 3221225622. 

Гм. Вообще-то, 3221225622 = 0xc0000096, что больше похоже на код исключения...
А Вы SetLastError(0) перед LoadLibrary делаете?

Цитата

//
// MessageId: STATUS_PRIVILEGED_INSTRUCTION
//
// MessageText:
//
// {EXCEPTION}
// Privileged instruction.
//
#define STATUS_PRIVILEGED_INSTRUCTION    ((NTSTATUS)0xC0000096 L)

Автор: Static 31.1.2012, 13:45
Относительные пути к dll во время обычного запуска и во время отладки правильно указаны?

Автор: 12usver12 2.2.2012, 19:19
сделай GetCurrentDirectory во время отладки и сравни с путем своей дллки 

Автор: GremlinProg 6.2.2012, 06:38
по теме, т.е. конкретно: почему при отладке не подгружается, а без нее - подгружается, соглашусь с последними постами,
а вот что касается остального + буквально на днях обсуждали аналогичную тему:
Цитата(becks @  30.1.2012,  18:32 Найти цитируемый пост)

...
extern "C" int __declspec(dllexport) GetFactsFromText (const char* inp_file, const char* out_file, const char* config_file );
...
typedef int ( __declspec( dllimport ) * GetFactsFromTextType (const char* inp_file,const char* out_file, const char* config_file));

1. сомневаюсь, что таким экспортом получится импортировать GetProcAddress(dllInstance, "GetFactsFromText"), т.к. имя функции модифицируется в соответствии с принятым соглашением вызова в dll,

2. прототипы стоит объявить примерно так:
Код

...
__declspec( dllexport ) int __stdcall GetFactsFromText (const char* inp_file, const char* out_file, const char* config_file );
...
typedef int ( __stdcall * GetFactsFromTextType ) ( const char*, const char*, const char* );

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)