Привет всем, мне нужно поставить в windows хук на клавиатуру, поэтому нужно сделать DLL, поэтому фактически мое приложение будет из 2 файлов, а очень не хочется чтобы приложение было из больше чем одного файла, тем более что оно будет очень малое, по этому вопрос, если возможно то как включить DLL в екзешку которая использует этот DLL? Если нельзя то у меня тока две возможности, либо сделать чтото на подобии инсталятора который бы извлекал из себя эти два файла, либо я даю знать юзверям чтобы скачали оба файла и чтобы DLL сами поставили в папку windows (но эт уже маразм я думаю) Кто поможет ставлю ящик пива )
ну создаешь файл длл, а содержимое - код длл пишешь из своих данных. ну и потом почему длл должна быть в папке виндовз?? достаточно папки с твоей прогой. для глобального хука процедура-обработчик ловушки _должна_ находиться в оддельном длл файле, так как он будет проецироватся к порцессу в котром сработал хук.
CrazyFun - в windows чтобы чайник не стер .dll случайно (думая что мусор, бывает и такое) хорошо, спасибо, думаю прога будет распространятся в .zip файле где будут оба файла, и readme.txt в котором напишу что оба файла (.dll & .exe) всегда должны находится в тойже директории.
xlinuks Это сделать очень просто! Как уже сказали выше, помести DLL'ку в ресурсы программы. Далее, при запуске программа должна извлечь из своих ресурсов DLL'ку. Вот и все. Ниже я приведу код программы на ассемблере (MASM32+Win32 API), который делает то, что тебе нужно. Она извлекает из своих ресурсов DLL'ку, подгружает ее, и вызывает ее функцию. Изменить ее под твои нужды очень просто. Главное на что тебе нужно обратить внимание, это функция EXres. Именно эта функция извлекает файл из ресурсов и записывает его на диск. Вот код программы (не помню уже, где взял ее): Код (Text): .686 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\advapi32.inc includelib \masm32\lib\advapi32.lib includelib \masm32\lib\kernel32.lib include \masm32\include\user32.inc includelib \masm32\lib\user32.lib .data LibName db "Test_DLL.dll",0 Name_Main_Exe db "main", 0 RsrcName db "DLLFile", 0 fName db "C:\New\Test_DLL.dll", 0 hFile dd 0 written dd 0 MSGText db 'DLL-ка извлечена и загружена!', 0 MSGCaption db 'Внимание!!!', 0 EXres PROTO .data? hLib dd ? folderbuffer db 512 dup(?) .code start: invoke GetFullPathName, invoke EXres invoke LoadLibrary,addr LibName mov hLib,eax invoke MessageBox, NULL, offset MSGText, offset MSGCaption, MB_OK invoke FreeLibrary, hLib invoke DeleteFile, addr fName invoke ExitProcess, NULL EXres PROC local hResInfo_file_1:HRSRC local cb_file_1:UINT local pRes_1:LPVOID invoke FindResource, NULL, addr RsrcName, addr Name_Main_Exe .if eax != NULL mov hResInfo_file_1, eax invoke LoadResource, NULL, hResInfo_file_1 .if eax != NULL mov pRes_1, eax invoke SizeofResource, NULL, hResInfo_file_1 mov cb_file_1, eax invoke LockResource, hResInfo_file_1 invoke lstrcat, ADDR folderbuffer, ADDR fName invoke CreateFile,OFFSET folderbuffer, GENERIC_WRITE,FILE_SHARE_READ, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 mov hFile,eax invoke WriteFile,hFile,pRes_1,cb_file_1,OFFSET written,NULL invoke CloseHandle,hFile .endif .endif ret EXres ENDP end start в данном случае для того чтобы добавить файл в рессурсы в файл .RC была добавлена следующая строка: DLLFile main Test_DLL.dll Вот и все
Можно экзешник загружать как диэлл. В нем должна быть директория релоков, и если надо то директория экспорта.