Форум » [x]Harbour » Как "зашить" ini-ник в ЕХЕ-файл ? » Ответить

Как "зашить" ini-ник в ЕХЕ-файл ?

Andrey: Всем привет. Хочется перенести INI-файл внутрь EXE-ника. И чтобы была возможность отредактировать его. Какие есть варианты ?

Ответов - 16

Dima: В MEMO перенеси

PSP: Андрей, такой exe-шник будет хитом №1 у ВСЕХ антивирусов... :)

SergKis: Andrey пишет:Хочется перенести INI-файл внутрь EXE-ника [pre2] ================================= RC pvn.lv CUSTOM Pvn.lv pvn.ru CUSTOM Pvn.ru pvn0.dbf CUSTOM Pvn0.dbf ================================= применение Res2File(Self:LANGINI, lower("PVN"+"."+Self:LANG)) // языковые ini файлы LV / RU ================================= HB FUNCTION Res2File( cFile, cRes, cTip ) // Ресурс по имени в файл (если файла нет) LOCAL j, l IF file(cFile); RETURN .T. ENDIF Default cTip To "CUSTOM" j := bkApi_LoadResource(bkApi_GetInst(), cRes, cTip) l := ! empty(j) .and. valtype(j) == "C" IF l; hb_memowrit(cFile, j) ENDIF RETURN l // В MiniGui есть функция GetInstance(), похоже ее можно использовать вместо BKAPI_GETINST() ================================= C #define HB_OS_WIN_USED #include "hbapi.h" #include "hbapierr.h" #include "hbwinuni.h" #include "hbwapi.h" HB_FUNC( BKAPI_LOADLIBRARY ) { LPSTR pLib; HINSTANCE hInst; // Указатель загруженой либы pLib = ( LPSTR ) hb_parc(1); hInst = LoadLibraryEx( pLib, NULL, LOAD_LIBRARY_AS_DATAFILE); hb_retptr( hInst ); } HB_FUNC( BKAPI_FREELIBRARY ) { HINSTANCE hInst; hInst = ( HINSTANCE ) hb_parptr( 1 ); if( hInst!=NULL ) FreeLibrary( hInst ); } HB_FUNC( BKAPI_LOADRESOURCE ) { HINSTANCE hInst; HRSRC hRes; HGLOBAL hMem; void *pMem; char Name[256]; char Type[256]; char *pName, *pType; DWORD i,k; hInst = ( HINSTANCE ) hb_parptr( 1 ); if(hInst==NULL) { hb_retclen("",0); return ; } memset(Name, 0, 256); memset(Type, 0, 256); pName = (char *) hb_parc(2); k = hb_parclen(2); k = (k < 256)? k : 255; for(i=0;i<k;i++) Name = *pName++; pType = (char *) hb_parc(3); k = hb_parclen(3); k = (k < 256)? k : 255; for(i=0;i<k;i++) Type = *pType++; hRes = FindResource( hInst, Name, Type); if( hRes==NULL ){ hb_retclen("",0); return ; } hMem = LoadResource( hInst, hRes); if( hMem==NULL ){ hb_retclen("",0); return ; } pMem = LockResource( hMem ); if( pMem==NULL ){ hb_retclen("",0); return ; } k = SizeofResource( hInst, hRes ); hb_retclen( ( char * ) pMem, k); } HB_FUNC ( BKAPI_GETINST ) { HINSTANCE hInst; HANDLE hInstance = NULL; hb_winmainArgGet( &hInstance, NULL, NULL ); hInst = ( HINSTANCE ) hInstance; hb_retptr( hInst ); } [/pre2]


SergKis: SergKis пишет:Скрытый текст Не уследил за [ i ] - текст исказился. Повторю часть: [pre2] pName = (char *) hb_parc(2); k = hb_parclen(2); k = (k < 256)? k : 255; for(i=0;i<k;i++) Name[ i ] = *pName++; pType = (char *) hb_parc(3); k = hb_parclen(3); k = (k < 256)? k : 255; for(i=0;i<k;i++) Type[ i ] = *pType++; [/pre2]

Andrey: PSP пишет: Андрей, такой exe-шник будет хитом №1 у ВСЕХ антивирусов... :) Почему ? SergKis СПАСИБО БОЛЬШОЕ ! Буду разбираться....

PSP: Andrey пишет: Почему ? Ты же хочешь Andrey пишет: чтобы была возможность отредактировать его Как должен антивирус реагировать на то, что некий exe-файл вдруг изменился? :)

Andrey: PSP пишет: Как должен антивирус реагировать на то, что некий exe-файл вдруг изменился? :) Да нормально... Каспер при изменении ЕХЕ-ника заново его сканирует и потом выдает, что все ок ! А у других тоже так же должно быть... Вообще то это разовая операция, настроил и забыл....

Andrey: SergKis пишет: pvn0.dbf CUSTOM Pvn0.dbf Смотрю даже dbf-ку в ресурсы затолкали... Классно !

SergKis: PSP пишет:такой exe-шник будет хитом №1 у ВСЕХ антивирусов... Давно использую такую штуку, как хранение первоначальных настроек программы в dll или exe и пока все OK!

Pasha: SergKis пишет: Давно использую такую штуку, как хранение первоначальных настроек программы в dll или exe и пока все OK! Для этого достаточно оператора: Параметр := if( ЕстьПараметр, ЕгоЗначение, ЗначениеПоУмолчанию ) У меня определяется массив вида: { {ИмяПараметра, ЗначениеПоУмолчанию }, ... } При старте программы я считываю конфигурацию из dbf+fpt, если параметр есть - беру его значение, иначе - значение по уполчанию. Это и есть первоначальные настройки программы. При изменении значения параметра записываю его в dbf+fpt Зачем делать лишний подарок антивирусам в виде самомодифицирующихся exe ? У них и так тяжелая работа.

SergKis: Pasha пишет:У меня определяется массив вида: { {ИмяПараметра, ЗначениеПоУмолчанию }, ... } При старте программы я считываю конфигурацию из dbf+fpt, если параметр есть - беру его значение, иначе - значение по уполчанию. Это и есть первоначальные настройки программы. При изменении значения параметра записываю его в dbf+fpt Зачем делать лишний подарок антивирусам в виде самомодифицирующихся exe ? У них и так тяжелая работа. Можно делать как угодно и так и по другому - как кто считает удобным. Имея любой др.файл к exe надо контролировать соответствие версии их, т.к. сколько угодно раз делают exe один, а файл другой оставляют или наоборот - проблемы телефонные начинаются. Языковые ini выгрузил, потом пользовтели меняют тексты под себя, зашитое в программу не поменяешь, потом dbf - разработанная форма (по департаменту) с формулами, константами, с правилами отбора, таких объектов набирается ..., есть xml-ы с алгоритмами к печатям, для получения др. xml на export - все это удобно относить к той версии exe к которой они разработаны. Если добавил функцию в prg или png, bmp в ресурсы и собрал new exe - разве от этого получается самомодифицирующихся exe ? На лету никогда exe не модифицировал и не собираюсь.

Andrey: SergKis пишет: // В MiniGui есть функция GetInstance(), похоже ее можно использовать вместо BKAPI_GETINST() А как ? Почему то эти функции в МиниГуи не собираются. SergKis пишет: pvn0.dbf CUSTOM Pvn0.dbf А почему CUSTOM ? В BCC советуют использовать RCDATA ... http://www.sources.ru/cpp/faqs/75.htm

SergKis: Andrey пишет:А почему CUSTOM ? Исторически сложилось с VO 2.0. GetInstance() сам не использую, но давно смотрел по тексту - было как bkApi_GetInst(). Почему то эти функции в МиниГуи не собираются добавил их в пример IconAssociatedFile demo4.prg бросил hbwapi.h из Harbour\contrib\hbwin к demo4.prg ... все собралось.

Andrey: SergKis пишет: бросил hbwapi.h из Harbour\contrib\hbwin Да теперь у меня тоже собралось. Но не работает ? Вот отдельный пример - http://files.mail.ru/5259FFDF1F054CB9AAB7E128538EB097

SergKis: Andrey пишет:В BCC советуют использовать RCDATA ... для хранения exe в ресурсах, наверно, надо использовать RCDATA, а не CUSTOM. Сам такое не использую.

Andrey: SergKis пишет: для хранения exe в ресурсах, наверно, надо использовать RCDATA, а не CUSTOM. Сделал пример, заработало - http://files.mail.ru/B87770D830CC41B68F1523B400924877 Для ехе тоже можно использовать CUSTOM. Но вот прикол, BCC 5.5.1 НЕ МОЖЕТ ИСПОЛЬЗОВАТЬ фаил .RES если он больше 1Мб (или чуть меньше), т.е. суммарный объем ресурсов не должен превышать этот размер. НЕ ЛИНКУЕТСЯ ресурсный файл, выдает ошибку: Turbo Incremental Link 5.66 Copyright (c) 1997-2002 Borland Fatal: Access violation. Link terminated. hbmk2[demo]: Error: Running linker. 2



полная версия страницы