Файл в ехе
Подскажите плз как засунуть какой-либо файл внутрь программы в ран-тайм
Можно удалить,добавить ресурсы в экзешник и дллки с помощью UpdateResource,правда не везде работает.
Можно удалить,добавить ресурсы в экзешник и дллки с помощью UpdateResource,правда не везде работает.
Подробнее можно
Подробнее можно
Почитай MSDN. Вот оттуда пример. Если что будет непонятно,объясню поподробнее.
HRSRC hResLoad; // handle to loaded resource
HANDLE hExe; // handle to existing .EXE file
HRSRC hRes; // handle/ptr. to res. info. in hExe
HANDLE hUpdateRes; // update resource handle
char *lpResLock; // pointer to resource data
BOOL result;
// Load the .EXE file that contains the dialog box you want to copy.
hExe = LoadLibrary("hand.exe");
if (hExe == NULL)
{
ErrorHandler("Could not load exe.");
}
// Locate the dialog box resource in the .EXE file.
hRes = FindResource(hExe, "AboutBox", RT_DIALOG);
if (hRes == NULL)
{
ErrorHandler("Could not locate dialog box.");
}
// Load the dialog box into global memory.
hResLoad = LoadResource(hExe, hRes);
if (hResLoad == NULL)
{
ErrorHandler("Could not load dialog box.");
}
// Lock the dialog box into global memory.
lpResLock = LockResource(hResLoad);
if (lpResLock == NULL)
{
ErrorHandler("Could not lock dialog box.");
}
// Open the file to which you want to add the dialog box resource.
hUpdateRes = BeginUpdateResource("foot.exe", FALSE);
if (hUpdateRes == NULL)
{
ErrorHandler("Could not open file for writing.");
}
// Add the dialog box resource to the update list.
result = UpdateResource(hUpdateRes, // update resource handle
RT_DIALOG, // change dialog box resource
"AboutBox", // dialog box name
MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), // neutral language
lpResLock, // ptr to resource info
SizeofResource(hExe, hRes)); // size of resource info.
if (result == FALSE)
{
ErrorHandler("Could not add resource.");
}
// Write changes to FOOT.EXE and then close it.
if (!EndUpdateResource(hUpdateRes, FALSE))
{
ErrorHandler("Could not write changes to file.");
}
// Clean up.
if (!FreeLibrary(hExe))
{
ErrorHandler("Could not free executable.");
}
Почти понятно. Если бы на паскале а то в типы не врубаюсь
Ну в паскале я не шарю,может кто поможет перевести это в паскаль из наших форумчан те.
Ну в паскале я не шарю,может кто поможет перевести это в паскаль из наших форумчан те.
Попробую сам разобраться, но кто сможет помочь - помогите плз
Попробую сам разобраться, но кто сможет помочь - помогите плз
HRSRC и HANDLE с успехом можно заменить на Cardinal , char * - в данным случае = Pointer ;)
Подскажите плз как засунуть какой-либо файл внутрь программы в ран-тайм
ты хочешь засунуть ресурс своей прогой в левый exe, или...
во время выполнения проги, открыть ресурс, который засунул туда (в свою прогу) при компиляции?
ты хочешь засунуть ресурс своей прогой в левый exe, или...
во время выполнения проги, открыть ресурс, который засунул туда (в свою прогу) при компиляции?
открыть ресурс со своей ехе могу.
Надо запихнуть рес в свою ехе, ну и в левый ;)
var
hExe: THandle;
hRes: HRSRC;
hResLoad: HRSRC;
lpResLock: Pointer;
hUpdateRes: THandle;
begin
hExe := LoadLibrary(PChar(Application.ExeName));
if hExe = 0 then begin
MessageBox(Handle, 'Не удалось загрузить библиотеку.', 'Ошибка', 0);
Exit;
end;
hRes := FindResource(hExe, 'MAINICON', RT_GROUP_ICON);
if hRes = 0 then begin
MessageBox(Handle, 'Не удалось найти ресурс.', 'Ошибка', 0);
Exit;
end;
hResLoad := LoadResource(hExe, hRes);
if hResLoad = 0 then begin
MessageBox(Handle, 'Не удалось загрузить ресурс.', 'Ошибка', 0);
Exit;
end;
lpResLock := LockResource(hResLoad);
if lpResLock = nil then begin
MessageBox(Handle, 'Не удалось блокировать ресурс.', 'Ошибка', 0);
Exit;
end;
if OpenDialog1.Execute then begin
hUpdateRes := BeginUpdateResource(PChar(OpenDialog1.FileName), False);
if hUpdateRes = 0 then begin
MessageBox(Handle, 'Не удалось открыть файл для записи.', 'Ошибка', 0);
Exit;
end;
if not UpdateResource(hUpdateRes, RT_GROUP_ICON, 'MAINICON', 0, lpResLock, SizeofResource(hExe, hRes)) then begin
MessageBox(Handle, 'Не удалось добавить ресурс в файл.', 'Ошибка', 0);
Exit;
end;
if not EndUpdateResource(hUpdateRes, False) then begin
MessageBox(Handle, 'Не удалось сохранить изменения в файле.', 'Ошибка', 0);
Exit;
end;
if not FreeLibrary(hExe) then begin
MessageBox(Handle, 'Не удалось выгрузить библиотеку.', 'Ошибка', 0);
Exit;
end;
end;
end;
только он не хочет работать так как надо...
[/CODE]
А что не так?
А что не так?
Ресурс добавляет, вот только берёт он его.... из того же файла, в который запихать пытается... глюк короче....
Я завтра на свежую голову посмотрю исходник еще раз... мож чё исправлю... ато спать пора уже