Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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
14-29590
Ega23
2004-01-19 10:57
2004.02.10
Вчера кино по ОРТ показывали


1-29421
GRF
2004-01-22 21:38
2004.02.10
В DLL не работает ActionManager


14-29577
TUser
2004-01-20 11:15
2004.02.10
Что за фигня


1-29307
Алексей
2004-01-30 05:52
2004.02.10
Запрос XPath в XMLdocument


6-29507
Elik
2003-12-05 10:51
2004.02.10
Как загрузить в IdHTTP вторую половину странички





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский