Азбука программирования в Win32 API


Азбука программирования в Win32 API - стр. 204


^include <windows.h> #include "dll.h"

int WINAPI WinMain(HINSTANCE hlnstance.HINSTANCE hPrevInstance, LPSTR IpszCmdLine, int nCindShow)

i

HINSTANCE hDII; FARPROC MyProcAddr;

if( (hDII = LoadLibrary("dll.dll")) != NULL)

244

MyProcAddr - GetProcAddress(hDH, "MyMcssage"); else {

MessageBox(NULL, "Sorry, cannot find requested DLL", "Sorry", MB_OK); return 0; i

(MyProcAddr)O; FreeLibrary(liDII); return 1 ;

Листинг № 12. Основной файл программы, осуществляющей вызов библиотечной функции, арр.срр посредством явной за!рузки DLL.

С точки зрения пользователя заметить какие-либо отличия в работе программ, использующих для вызова функций из DLL неявную компо­новку и явную загрузку, невозможно. С точки зрения программиста два отличия прямо-таки бросаются в глаза. Первое - если при неявной компо­новке в случае отсутствия DLL программа просто не запускается, то в случае явной загрузки, возможно перехватить такую ситуацию и предпри­нять какие-либо действия. И второе - у программиста прибавилось головной боли. Вместо обычного обращения к функции он должен вызвать еще три вспомогательные функции, да и требующаяся функция из DLL вызывается не напрямую, а косвенно, посредством использования ее адреса. Еще раз повто­рю - программист должен сам решить, стоит ли овчинка выделки.

ВЫВЕРНЕМ ПРОГРАММЫ НАИЗНАНКУ

Давайте попробуем разобраться в том, что все это означает и к чему может привести.

Начнем с файла, который использует ся как библиотекой, так и прило­жением - файла заголовков. Чтобы ехе-файл мог вызывать функции из DLL, то, с одной стороны, библиотека должна объявить их как доступ­ные, или, как говорят, экспортируемые. С другой стороны, сам ехе-файл должен определить эти функции как находящиеся в DLL, т. е. как импор­тируемые. Если мы объявим эти функции по-разному в заголовочном файле и непосредственно в тексте, мы не оберемся ошибок при компилч-ции. Следовательно, выход один - условная компиляция. Если мы по­смотрим на распечатку заголовочного файла dll.li, то увидим, что я опре­деляю макро MYAPI, которое принимает одно из двух значений (_declspec(dllexport)) или (_declspec(dllimport) ) в зависимости от факта определения другого макро, _MYDLL_ . Теперь понятно, что и в заголо­вочном, и в исходных файлах можно описать функцию, находящуюся в




Начало  Назад  Вперед



Книжный магазин