Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.10;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.02 c
14-29608
Nous Mellon
2004-01-19 13:10
2004.02.10
Тоже GIF :)


14-29567
HermitAlex
2004-01-20 13:36
2004.02.10
Обучение игры в бильярд


3-29265
maxon
2004-01-16 10:06
2004.02.10
Compute


3-29242
N&N
2004-01-19 09:16
2004.02.10
Перенос данных их Excel в базу данных


3-29216
HolyMan
2004-01-18 23:16
2004.02.10
Отображаение Булевых полей в гриде!