Форум: "Игры";
Текущий архив: 2004.02.10;
Скачать: [xml.tar.bz2];
ВнизSimple Miner Найти похожие ветки
← →
McSimm2 (2003-07-29 10:40) [0]Написал сабж на Api.
Подскажите где можно хранить результаты и как ?
← →
miek (2003-07-29 10:54) [1]Смотря какие результаты. Текст, немного числе - проще всего в ini-файле.
← →
McSimm2 (2003-07-29 11:01) [2]Дла, конечно - 3 символьные строки и 3 числовые.
В ini-файле ? Его ведь придётся вместе с программой переносить - хотелось бы, что бы одним файлом было. Может есть способ прям в exe-шник пихать - или эт у меня бред начался :\ ??
← →
pasha676 (2003-07-29 11:19) [3]
> Его ведь придётся вместе с программой переносить - хотелось
> бы, что бы одним файлом было. Может есть способ прям в exe-шник
> пихать - или эт у меня бред начался :\ ??
начался. Зачем переносить? Пусть он создается. На новой машине - новые рекорды. Тогда кто хочет тот и переносит.
← →
GrEG (2003-07-29 11:36) [4]В ехе-шнике храни.
Лично сам делал так (стояла задача сохранения настроек программы):
В основной программе определял константу, начинающуюся на редкое сочетание символов (z.B.: zHighscoreTable = "#$%#$%#$% ( так делаю я в своей программе) [4] В ехе-шнике храни.
Лично сам делал так (стояла задача сохранения настроек программы):
В основной программе определял константу, начинающуюся на редкое сочетание символов (z.B.: zHighscoreTable = "#$%#$%#$% "). Как можно догадаться, #$%#$%#$% является ключом, по которому будет производиться поиск в exe-шнике, а пробелы после ключа и есть твоя таблица рекордов. Кроме того, в основную программу в качестве ресурса включается маленький exe-шник, обеспечивающий изменение основной программы.
При завершении основной программы, она извлекает в свою папку из ресурса exe, и создает файл, описывающий изменения, которые нужно внести в exe. После этого извлеченный exe запускается на исполнение, в командной строке для него указывается имя файла с шаблонами изменений. После завершения работы, программа-модификатор удаляет файл шаблонов, запускает основную программу с ключом, обеспечивающим удаление программы-модификатора. Далее возможны варианты:
1) после удаления программы-модификатора, основная программа закрывается (так делаю я в своей программе);
2) после удаления программы-модификатора, основная программа продолжает работу (как мне кажется, это более целесообразно в твоем случае).
Ну и маленькие замечания:
1) обе программы должны поддерживать набор ключей, обеспечивающих работоспособность связки, т.е. модификатор должен знать как обработать файл-шаблон, а основная программа, узнать ключ удаления модификатора;
2) при запуске обеих программ: основной и модификатора - необходимо организовать задержки, позволяющие второй программе в паре завершить свою работу, иначе OS не позволит изменять или удалять запущенный на исполнение файл.
← →
GrEG (2003-07-29 11:40) [5]Еще одно дополнение.
По указанному в шаблоне ключу программа модификатор ищет место в exe-шнике, где располагается таблица рекордов, а потом изменяет часть файла, расположенную за ключом. Главное не перестараться, и не затереть часть исполняемого файла :-).
← →
McSimm2 (2003-07-29 11:56) [6]А каким образом работающая программа сможет записывать в свой exe`шник текстовую информацию ? Она не будет ругаться на такое действие? Ведь как я понял, программа-модификатор должна обращаться к exe - файлу, открывать его для редактирования и после записи ещё и сохранять.
← →
GrEG (2003-07-29 13:46) [7]> А каким образом работающая программа сможет записывать в свой exe`шник текстовую информацию ?
Не работающая (она действительно не сможет), а программа-модификатор. Это же две разные программы. К тому моменту, когда модификатор начнет вносить изменения, основная программа должна уже закончитсвое выполнение. Обрати внимание на маленькое замечание номер два.
Самый грубый вариант: в файле проекта основной программы последней операцией должен быть запуск извлеченного ранее из ресурса модификатора с соответствующей командной строкой:
program SimpleMiner;
var
....
procedure RunModifier;
begin
...
ShellExecute(...);
end;
begin
...
RunModifier;
end.
Первой строкой модификатора можно поставить некоторую задержку.
Аналогично с парой противоположного порядка исполнения: в конце модификатора запускаем основную программу с ключом для удаления модификатора, в основной программе делаем некоторую задержку.
Повторяю, это самый грубый вариант.
В качестве одной из альтернатив: в основной программе можно организовать отдельный поток, который будет пытаться открыть для записи файл программы-модификатора. Как только ему это удастся (модификатор закончил работу), можно удалять программу-модификатор и завершать поток. Само собой, нужно предусмотреть вариант когда открыть файл программы-модификатора по какой-либо причине не удастся до конца выполнения основной программы. В этом случае поток нужно будет прервать принудительно. В программе модификаторе дополнительный поток организовывать нет смысла, так как попытка изменения файла и есть основная цель программы-модификатора.
Описанный выше пример опробован на практике под Win9x, Win2k, WinXP.
← →
McSimm2 (2003-07-29 14:07) [8]У тебя куска кода - подобной реализации не осталось - был бы очень признателен ?...
← →
GrEG (2003-07-29 14:29) [9]Надеюсь, этого будет достаточно:
Код проекта. Сделаны некоторые упрощения, но, в целом, код работоспособен.
program mw;
{$R MW_RES.RES}
const
csParamBuffer = "###***###$$$0000000000";
csParamBufferPattern1 = "__###***";
csParamBufferPattern2 = "__###$$$";
....
function DeleteModifier(sFileName:string):boolean;
var
i:integer;
begin
i:=0;
while i < 50 do begin
Result:=DeleteFile(PChar(sFileName));
if Result then exit;
sleep(20);
inc(i);
end;
Result:=false;
end;
function StartAfterUpdating:boolean;
var
s:string;
i:integer;
begin
Result:=false;
if ParamCount > 0 then
s:=ParamStr(1);
i:=Pos(":",s);
if i = 0 then exit;
if Copy(s,1,i-1) = "/delete_modifier" then begin
s:=Copy(s,i+1,Length(s)-i);
if not FileExists(s) then exit;
DeleteModifier(s);
( hInstance,"EXE_MDFR","EXEFILE") [9]Надеюсь, этого будет достаточно:
Код проекта. Сделаны некоторые упрощения, но, в целом, код работоспособен.
program mw;
{$R MW_RES.RES}
const
csParamBuffer = "###***###$$$0000000000";
csParamBufferPattern1 = "__###***";
csParamBufferPattern2 = "__###$$$";
....
function DeleteModifier(sFileName:string):boolean;
var
i:integer;
begin
i:=0;
while i < 50 do begin
Result:=DeleteFile(PChar(sFileName));
if Result then exit;
sleep(20);
inc(i);
end;
Result:=false;
end;
function StartAfterUpdating:boolean;
var
s:string;
i:integer;
begin
Result:=false;
if ParamCount > 0 then
s:=ParamStr(1);
i:=Pos(":",s);
if i = 0 then exit;
if Copy(s,1,i-1) = "/delete_modifier" then begin
s:=Copy(s,i+1,Length(s)-i);
if not FileExists(s) then exit;
DeleteModifier(s);
Result:=true;
end;
end;
procedure RunModifier;
var
hRes,h:THandle;
p:Pointer;
iSize:integer;
f:file;
si:TStartupInfo;
pi:TProcessInformation;
begin
hRes:=FindResource(hInstance,"EXE_MDFR","EXEFILE");
if hRes = 0 then exit;
h:=LoadResource(hInstance,hRes);
if h = 0 then exit;
p:=LockResource(h);
if p = nil then exit;
iSize:=SizeOfResource(hInstance,hRes);
AssignFile(f,"exe_mdfr.exe");
Rewrite(f,1);
BlockWrite(f,p^,iSize);
CloseFile(f);
FillChar(si,SizeOf(si),0);
si.cb:=SizeOf(si);
CreateProcess(
nil, // pointer to name of executable module
"exe_mdfr.exe mw.mdf",
nil, // pointer to process security attributes
nil, // pointer to thread security attributes
false, // handle inheritance flag
CREATE_DEFAULT_ERROR_MODE or
NORMAL_PRIORITY_CLASS, // creation flags
nil, // pointer to new environment block
nil,
si, // pointer to STARTUPINFO
pi // pointer to PROCESS_INFORMATION
);
end;
begin
if StartAfterUpdating then exit;
Main;
RunModifier;
end.
В коде есть к чему придраться, но мне было достаточно и его.
Код модификатора привести не могу.
← →
GrEG (2003-07-29 14:33) [10]const
csParamBuffer = "###***###$$$0000000000";
csParamBufferPattern1 = "__###***";
csParamBufferPattern2 = "__###$$$";
Подобный изврат вынужден. Если при формировании файла шаблона, указать напрямую ключ (###***###$$$), то еxe-файл будет содержать уже два вхождения ключа - появляется неоднозначность. Комбинация двух констант с обрезанным началом коллизиии не вызывает.
← →
McSimm2 (2003-07-29 14:54) [11]спасибо !!!
Если к exe- файлу что то будет приписано - это не может вызвать никакой негативной реакции со стороны антивирусных пакетов. Т.к. IMHO это будет расценено как наличие вируса в exe?
И ещё раз - Если откомпилированный exe-файл откроем, как текстовый и отредактируем его - добавив нек-рые символы - как мы в следующий раз его запустим, ведь там левая инфа сидеть будет..?
← →
GrEG (2003-07-29 16:24) [12]Мы ничего не приписываем, мы изменяем существующий exe-файл. У меня стоит AVP и пока никаких возмущений с его стороны не наблюдалось.
В предыдущем примере без опасения повредить EXE-файл можно менять только нули, стоящие в определении константы после ключа. Это накладывает ограничение на размер изменяемых данных. Если хочешь хранить таблицу результатов, оставь достаточно места.
В хэлпе WinAPI описан способ изменения ресурсов файла без его перекомпиляции (с помощью функций BeginUpdateResource, UpdateResource, EndUpdateResource), но я его не пробовал. По поводу UpdateResource был вопрос на этом сайте в форуме WinAPI, если не ошибаюсь, но я не помню чем дело кончилось.
← →
GrEG (2003-07-29 16:33) [13]Вот ссылочка относительно UpdateResource:
http://forum.codenet.ru/showthread.php?threadid=7629
Да, BeginUpdateResource, UpdateResource, EndUpdateResource работает под операционками на базе NT (так написано в справочнике).
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2004.02.10;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.017 c