Короче, что-то прога пашет только в win98, а в 2k окно не масштабируется и позиция не устанавливается.. Что я не учёл? Код (Text): format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' section '.code' code readable executable align 4 start: mov edi, sBuff invoke GetWindowsDirectory, edi, 260 test eax, eax jz @exit invoke lstrcat, edi, szFileName test eax, eax jz @exit xor esi, esi mov ebx, 5 align 4 @@: invoke CreateProcess, esi, edi, esi, esi, esi, NORMAL_PRIORITY_CLASS,\ esi, esi, StartupInfo, ProcessInfo test eax, eax jz @exit invoke CloseHandle, [ProcessInfo.hThread] invoke CloseHandle, [ProcessInfo.hProcess] dec ebx jnz @B @exit: invoke ExitProcess, esi section '.data' data readable writeable szFileName db '\notepad.exe',0 StartupInfo: cb dd sizeof.STARTUPINFO lpReserved dd NULL lpDesktop dd NULL lpTitle dd NULL dwX dd 5 dwY dd 5 dwXSize dd 400 dwYSize dd 300 dwXCountChars dd 0 dwYCountChars dd 0 dwFillAttribute dd 0 dwFlags dd STARTF_USESHOWWINDOW or STARTF_USEPOSITION or STARTF_USESIZE wShowWindow dw SW_SHOW cbReserved2 dw 0 lpReserved2 dd NULL hStdInput dd 0 hStdOutput dd 0 hStdError dd 0 section '.udata' readable writeable ProcessInfo PROCESSINFO sBuff rb 260 section '.idata' import data readable library kernel32,'KERNEL32.DLL' include '%fasminc%\APIA\KERNEL32.INC'
Asterix <ol type=1><li>прежде чем задать вопрос, проанализируй результат GetLastError после CreateProcess;<li>в w2k блокнот располагается в GetSystemDirectory, а не в GetWindowsDirectory;<li>неплохо бы проверять есть ли слеш в конце полученного пути и достаточно ли в буфере места для добавления имени запускаемой программы.</ol> PS если еще добавить неудачный, на мой взгляд, выбор заголовка, то этой теме самое место в WASM.HELHEIM
q_q 2) ничего подобного, у меня он есть и в Windows директории, да скорее и у тебя тоже.. 1),3) разве я сказал что блокнот не запускается, я говорил что не выставляются размеры и положение окна notepad'а в HELHEIM ему не место
Asterix , да скорее и у тебя тоже У меня в winnt нет, возможно, я его удалил. Посмотрел на соседней xp’шке – действительно два раза, и еще раз в dllcache. разве я сказал что блокнот не запускается, я говорил что не выставляются размеры Хорошо. Тогда так. В реестре w2k есть ключик HKEY_CURRENT_USER\Software\Microsoft\Notepad, а в нем есть iWindowPosX, iWindowPosY, iWindowPosDX, iWindowPosDY.
q_q > У меня в winnt нет, возможно, я его удалил. У тебя винда неправильная, потому что я когда-то в какой-то из двух Windows 2k или XP пытался удалить notepad.exe, но он всё время появлялся снова, хотя может это был calc.exe, точно не помню. Если его там не будет могут быть проблемы с совместимостью с прогами написанными для win98 и вызывающими notepad.exe > Хорошо. Тогда так. В реестре w2k есть ключик HKEY_CURRENT_USER\Software\Microsoft\Notepad Спасибо. Я догадывался что ключик есть раз уж блокнот запоминает позицию, но всё-же это неправильно, должен же быть приоритет параметров передаваемых через структуру STARTUPINFO, перед теми параметрами что содержаться в реестре..
Asterix должен же быть приоритет параметров передаваемых через структуру STARTUPINFO Ты, в своих программах, хоть раз использовал GetStartupInfo для получения координат окна? Часто ли используешь overlapped window в комплекте с CW_USEDEFAULT?
А если попробовать запустить блокнот без поиска в виндовой папке, а просто "notepad"? ShellExecuteEx спокойно запускает блокнот и не жужжит. Вобще, все, что лежит в виндовой или системной папках, запускается без указания пути - это стандартный путь поиска проги. Но вот насчет CreateProcess не знаю, может он не ищет автоматом.. В любом случае, если надо запустить прогу и все, то лучше юзать ShellExecute (кстати, запускает не только проги).
n0p Речь не шла о простом запуске, нужно было запустить с заданными, вполне конкретными, параметрами окна, мне показалось что ShellExecute этого не умеет. Насколько я помню ShellExecute тоже сводится к CreateProcess.. может и ошибаюсь, смотреть лень сейчас. q_q > Ты, в своих программах, хоть раз использовал GetStartupInfo для получения координат окна? По-моему есть разница я в своих программах или MS, у них должно быть всё правильно и всё учитываться и уж тем более учитываться что структура STARTUPINFO содержит информацию о положении окна.
Asterix По-моему есть разница я в своих программах или MS Только не говори, что все программы от MS, кроме блокнота, учитывают все нюансы. Там тоже люди работают. Почему они должны быть лучше тебя? Например, мне нравится, когда программа помнит "свое место". PS и все таки WASM.HELHEIM
q_q > Например, мне нравится, когда программа помнит "свое место". Пусть помнит, если структура STARTUPINFO содержит нули в координатных и размерных параметрах, иначе пусть берет параметры из этой структуры, но не из реестра.
Asterix если структура STARTUPINFO содержит нули в координатных и размерных параметрах Вот и ты ошибаешься (а хочешь от MS'овцев правильности). Сначала надо проверять STARTUPINFO.dwFlags на наличие STARTF_USEPOSITION и STARTF_USESIZE. Пусть помнит ... иначе пусть берет ... Imho только личным примером ты сможешь убедить сообщество программистов в жизнеспособности такого подхода.
q_q > Вот и ты ошибаешься (а хочешь от MS'овцев правильности) Я не ошибаюсь, я знаю что нужно сначала флаги проверять, просто я не стал глубоко вдаваться в описание процедуры проверки и немного утрировал её > Imho только личным примером ты сможешь убедить сообщество программистов в жизнеспособности такого подхода. Смысла нет, я же не пишу системное приложение, которое должно учитывать потребности любого пользователя, и программиста в том числе, пусть об этом MS заботится. Короче это у них баг и точка >
Asterix я же не пишу системное приложение ... это у них баг Легко обвинять других. Покажи всему миру как правильно писать системное приложение, возможно MS задумается, изменит свой подход и будет выпускать только качественное ПО, обладающее настройками, удовлетворяющими любые потребности любых пользователей.
Вы, должно быть, шутите! Какие еще STARTUPINFO? Лично я об этом первый раз слышу, а люди, которые пишут программы путем мышевожения по экрану и тыканья в три кнопки (а таких 75%) вобще не поймут о чем речь. А ведь именно они задают моду на программы, а не всякие дядьки из М$. Ну и что, что где-то в спецификации что-то написано? Никто их все-равно не читает. Хранить настройки в инишнике тоже не рекомендуется - для этого реестр есть. Но тем не менее большинство людей пользуются инишниками, потому что это удобнее, проще, а еще они не знают как в реестре гадить правильно. Ну что их за это, расстрелять теперь? Гринпис не одобрит. Так что не тисипите айпи и делайте все так, чтобы только работало (это я про запуск блокнота). Естественно, что в более серьезных прогах следует начихать на моду и советы пьяных товарищей и делать все по уму, а тут можно и не надо.
n0p Хранить настройки в инишнике тоже не рекомендуется Imho с точки зрения кроссплатформенности нет ничего лучше текстового файла с настройками. более серьезных прогах следует Ознакомь, хотя бы меня, с критериями, определяющими серьезность программы. Imho если в мелочах привык "делать на отстаньте", то и в серьезном поведешь себя так же.
если позволите, выскажусь Imho с точки зрения кроссплатформенности нет ничего лучше текстового файла с настройками. вообще пора на xml переходить (я без всякой иронии) кто-нибудь считает, что это будет тормозить работу программы ? что касается STARTUPINFO, я считаю, что эту структуру M$ должна была обработать, notepad все-таки, не calc ведь...
Funbit > вообще пора на xml переходить Понятия не имею как их юзать, особенно в асм'е. С ini попроще работать и гораздо надёжнее чем с реестром.
Понятия не имею как их юзать, особенно в асм'е. Funbit, в общем-то, прав. Юзать их просто. Только не самому код писать, а заюзать библиотеку. Нормальная библиотека - это expat. Его API выучить и юзать. И все будет ОК
Asterix в MSDN посмотри XML DOM ms-help://MS.MSDNQTR.2002JUL.1033/dnxml/html/beginner.htm а юзать - создать пару объектов используя ф-ции COM и работать с ними, или через какую-нибудь thirdparty (т.е. не msxml) дллку. надо бы как-нибудь оформить поудобнее это дело для асма