Подскажите как можно вычислить путь к exe из самого exe. Программа при кликании по exe должна открывать файл путь к которому относительный (даже нет никакого пути, просто file.ini) , но она ищет файл в текущем каталоге. Если Например открыть папку эксполорером или тоталКомандером , то всё нормально работает, текущий каталог тот из которого запускается. А если например кликнуть из панели инструментов в раскрывающемся дереве каталогов, то текущий каталог совсем другой. Буква диска постоянно меняется , и нужно запускать не создавая ярлык.
почитай про GetPrivateProfileString и WritePrivateProfileString. Если последним параметром этим функциям передать просто имя файла, без пути, то он создаться/откроется в C:\Windows по умолчанию.
RamMerLabs Уже много раз упоминалось, что самый точные результаты даёт GetMappedFileName/ZwQueryVirtualMemory(MemorySectionName). Такие ф-ии, как GetModuleFileName или те же Toolhelp-API не гарантируют правильный путь к образу.
GetModuleFileNameEx, наверное. CreateProcess позволяет подсунуть совершенно любую командную строку, поэтому GetCommandLine не полностью надёжен.
l_inc учитывая, как был сформулирован вопрос, GetModuleFileName хватит за глаза. а потом уже приступать к NativeAPI и разбору содержимого АП процесса в поисках загруженных модулей. имхо)
>GetPrivateProfileString и WritePrivateProfileString я чего-то другим путём пошёл , просто через ReadFile() считываю спасибо за ссылку DWORD WINAPI GetModuleFileName( __in_opt HMODULE hModule, __out LPTSTR lpFilename, __in DWORD nSize ); If this parameter is NULL, GetModuleFileName retrieves the path of the executable file of the current process. читал через строку, и думал что всё понял
>GetCommandLine GetCommandLine тоже пробую интересно что если при запуске из bat-файла без параметров, как просто start this.exe после имени файла вместо '\0' идут два байта 0x03
RamMerLabs Там через слэш варианты выписаны, а не все необходимые вызовы. Так что Native API не обязательны. Хотя с тем, что "хватит за глаза", согласен. Да я бы и ничего не сказал, если б это кто-нибудь другой написал.
не знаю может стоило заводить отдельную тему, просто всё с той-же утилитой никак не разберусь. Текущий каталог получил из GetCommandLine. Прикрепил бинарник, потомучто код стыдно показать Но теперь не пойму как правильно останавливать процессы. Утилиту делал когда появилось желание вынести все сервера (Apache, mysqld, ...) на отдельный HD и что-то не сросталось делать так при помощи денвера, vhosts все самодельные. Запущенные из под утилиты процессы убиваются простым TeminateProcess() , даже быстрее чем я думал. Там просто не многое должно устанавливаться как сервисы виндовс, хотел это как-то обойти. Теперь если я, не убив все эти процессы, пытаюсь выключить виндовс. Появляется и висит просьба подтвердить остановку программы. (Возможно потомучто httpd.exe запустил другой httpd.exe который в свою очередь запустил perl.exe как fastcgi-сервер ) И что-то показалось виндовс начинает дольше останавливаться, если я пользовался серверами. Процессы потомки уничтожаются все. Не смог найти как правильнее остановить процесс, В msdn показалось какие-то неподходящие api , и написано что-то вроде того что если так как я придушивать процессы , остаются невыгруженными из памяти dll, которые должны уведомляться что-ли как-то если процесс сам себя выключает. Ничего не понял вобщем. И самое главное не понял есть-ли другой способ выключений. Или всётаки придётся при включении программы регистрировать сервисы и разрегистрировать при выключении ? Второе мне кажется так-же не всегда будет срабатывать. // потом подумал может из-за того что у меня не освободились какие-то переменные, по сообщению WM_DESTROY освобождается массив структур, Shell_NotifyIcon(NIM_DELETE,&nid); , DestroyMenu(hTrayMenu); А подменю которые динамически добавлялись к основному меню уничтожаются. Их обязательно уничтожать ? // перезалил файл 17.10.2010 фиксил подвисание окна при первом старте пропадание иконки в трее при перезапуске explorer добавил /GS- и самодельную memset для уменьшения размера exe
Нашёл здесь такое: Значит-ли это что то что в обработчике WM_DESTROY совсем не выполняется при остановке виндовс? upd:// Код (Text): case WM_QUERYENDSESSION: case WM_DESTROY: DESTROY: stopping( zsett , -2); Shell_NotifyIcon(NIM_DELETE,&nid); DestroyMenu(hTrayMenu); PostQuitMessage(0); return (message == WM_QUERYENDSESSION) ? 1:0; } return DefWindowProc(hwnd,message,wParam,lParam); } ???
If the function succeeds, the return value specifies the length of the string copied to the buffer, in characters. я читал 04-01-2010 22:15:08 но на win64XP , win32XP win32x7 win32Server2008 и кажется ещё где-то GetCommandLine() пока не ошибалась
Не смог успеть переместить в карантин Там именно при запуске определяется текущёё нахождение. Насчёт проблема похоже в в чём-то другом. Снёс антивирус, отключил планировщик заданий, раз 15 перезагрузил, зависания при остановке виндовс вроде на одном уровне. Осталось только понять как ещё можно останавливать демонов ( особенно httpd ) кроме TeminateProcess().