![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Здраствуйте, мне нужно запаковать dll в файл res и потом в программе чтобы при нажатии на баттон программа искала определенный exe файл можно через реестр (только я незнаю как) и копировала туда где лежит exe файл. Если это возможно напиши плз!
|
|
#2
|
||||
|
||||
|
народ очень нужно(
|
|
#3
|
|||
|
|||
|
А попонятнее объяснить?
Лично я нифига не понял. |
|
#4
|
||||
|
||||
|
Цитата:
![]() |
|
#5
|
||||
|
||||
|
Создаешь файл, например dll.rc. В него пишешь:
Код:
DLL RCDATA "<путь к длл>" Далее компилим ресурс при помощи brcc32.exe. Запускаем brcc32.exe через консоль с параметром путь к dll.rc. Всё. На выходе получим dll.res. Который добавляем проект Код:
{$R dll.res}А это ф-ия извлечения длл. Можешь задать так чтоб пользователь сам задавал путь к игре. В path должен быть путь вместе с именем длл. Код:
var
hRes, hMod, hFile, dwSize, n: dword;
pBuffer: pointer;
path: array[0..255] of char;
begin
hMod := FindResource(HInstance, 'DLL', RT_RCDATA);
if (hMod <> 0) then
begin
dwSize := SizeofResource(HInstance, hMod);
hRes := LoadResource(HInstance, hMod);
if (hRes <> 0) then
begin
pBuffer := LockResource(hRes);
if (pBuffer <> nil) then
begin
hFile := CreateFile(path, GENERIC_WRITE, FILE_SHARE_WRITE, 0, CREATE_ALWAYS, 0, 0);
if (hFile <> INVALID_HANDLE_VALUE) then
begin
SetFilePointer(hFile, 0, nil, FILE_BEGIN);
if not (WriteFile(hFile, pBuffer^, dwSize, n, 0)) then
MessageBox(0, 'Can''t write to file', 'Error', 16)
else
if (dwSize <> n) then
MessageBox(0, 'Not all bytes write to file', 'Error', 16)
CloseHandle(hFile);
end;
end;
FreeResource(hRes);
end;
end;
end.Последний раз редактировалось BoRoV, 09.12.2010 в 22:21. |
|
#6
|
||||
|
||||
|
спс=) как подключать я знаю, как создавать...забыл=) а про распаковку не знал! а как сделать чтобы программа находила файл и распаковывала именно туда!
|
|
#7
|
||||
|
||||
|
Ну для поиска файлов примеров уйма в инете... погугли.
|
|
#8
|
||||
|
||||
|
Нашол=) попробуем сделать что ты писал!
|
|
#9
|
||||
|
||||
|
а как можно извлечь из ресурса в определенную папку?
|
|
#10
|
||||
|
||||
|
Ну как-то так.
Код:
procedure DoWork();
var
s:string;
begin
s := Find('file.exe'); // Возвращает полный путь к файлу file.exe или ничего если не найден
if (s <> '') then
begin
s := ExtractFilePath(s);
ExtractDLLFromRes(pchar(s + 'file.dll'));
end;
end;
procedure ExtractDLLFromRes(path: pchar);
begin
// А это то что я тебе дал
end; |
|
#11
|
||||
|
||||
|
Вот решил всё вынести в отдельный модуль.
Код:
unit uExtractFileFromResources;
{
Extracting any resources to file
Author: BoRoV
Date: 10 dec 2010
Using:
1. Extracting from itself:
...
if not ExtractResToFile(HInstance, 'BIN', RT_RCDATA, 'C:\file.bin') then
MessageBox(0, PChar(SysErrorMessage(GetLastError())), 'Error', 16);
...
2. Extracting from another module:
...
hFile: DWORD;
...
hFile := LoadLibrary('C:\file.exe');
if (hFile <> 0) then
begin
if not ExtractResToFile(hFile, 'BIN', RT_RCDATA, 'C:\file.bin') then
MessageBox(0, PChar(SysErrorMessage(GetLastError())), 'Error', 16);
FreeLibrary(hFile);
end;
...
}
interface
uses
Windows;
// Declaration
function ExtractResToFile(hInst: DWORD; ResourceName: PChar; ResourceType: PChar; FileName: PChar): Boolean;
implementation
function ExtractResToFile(hInst: DWORD; ResourceName: PChar; ResourceType: PChar; FileName: PChar): Boolean;
var
hRes, hMod, hFile, dwSize, n: DWORD;
pBuffer: Pointer;
begin
Result := False;
hMod := FindResource(hInst, ResourceName, ResourceType);
if (hMod <> 0) then
begin
dwSize := SizeofResource(hInst, hMod);
hRes := LoadResource(hInst, hMod);
if (hRes <> 0) then
begin
pBuffer := LockResource(hRes);
if (pBuffer <> nil) then
begin
hFile := CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, 0, 0);
if (hFile <> INVALID_HANDLE_VALUE) then
begin
SetFilePointer(hFile, 0, nil, FILE_BEGIN);
if WriteFile(hFile, pBuffer^, dwSize, n, nil) then
if (dwSize = n) then
Result := True;
CloseHandle(hFile);
end;
end;
FreeResource(hRes);
end;
end;
end;
end. |
|
#12
|
||||
|
||||
|
Чет ошибку пишет! Мож исходник кинуть...умоляю!
|