Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Power Basic

Страница: 1 |

 

  Вопрос: Еще пару вопросов... Добавлено: 09.04.04 15:41  

Автор вопроса:  Macronix | Web-сайт: http://x250.net/ | ICQ: 170650558 

1. Как определить путь, откуда запущена прога ? (на VB эквивалент App.Path)

2. Как узнать, что прога уже запущена ? (на VB эквивалент App.PrevInstance)

Ответить

  Ответы Всего ответов: 5  

Номер ответа: 1
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #1 Добавлено: 09.04.04 18:37

FUNCTION WINMAIN (BYVAL hInstance AS DWORD, BYVAL hPrevInstance AS DWORD, _
                  BYVAL lpCmdLine AS ASCIIZ PTR, BYVAL iCmdShow AS LONG) AS LONG

 LOCAL WinWnd AS LONG, Prev AS ASCIIZ*20
 LOCAL szAppPath    AS ASCIIZ * %MAX_PATH
 LOCAL szAppName    AS ASCIIZ * %MAX_PATH


    '  если программа уже запущена, выходим
    IF FindWindow("", "Заголовок твоей проги") THEN EXIT FUNCTION
       

    ' путь и имя
    GetModuleFileName hInstance, szAppPath, SIZEOF(szAppPath)
    '
    szAppName = RIGHT$(szAppPath, LEN(szAppPath) - INSTR(-1, szAppPath, ANY "\/:"))
    '
    szAppPath = LEFT$(szAppPath, INSTR(-1, szAppPath, ANY "\/:"))

Поиск предыдущей запущенной проги не очень стандартный, но работает. И ещё: szAppPath возвращает путь со слэшем на конце ( в отличие от VB)

Ответить

Номер ответа: 2
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #2
Добавлено: 10.04.04 18:41

Обычно для определения предыдущей копии используют CreateMutex. Программа при запуске определяет, есть ли мутекс с заданным именем и выходит, если есть. Можно использовать также таблицу атомов.

Ответить

Номер ответа: 3
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #3 Добавлено: 10.04.04 20:16
Что то с CreateMutex не очень получилось, поэтому родился такой вариант

Ответить

Номер ответа: 4
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #4
Добавлено: 10.04.04 23:20

Вопрос в тему: Потребовалось определить, запущен ли определенный ЕХЕшник по определеному пути. ЕХЕшник не имеет окна - голый процесс. Использую CreateToolhelp32Snapshot, Process32First, Process32Next, в 98-й в массиве типа PROCESSENTRY32 p(i).sExeFile содержит имя и полный путь к файлу, а в XP, что оказалось несколько неожиданным - только имя файла. Причем, что интересно, программа, отображающая список процессов, скомпилированная под 98 (в коде стоит пресечение попытки запуска программы под NT) при запуске в режиме совместимости выдает нормальный путь+имя и нормальные хандлы модуля и процесса, а она же, запущенная из IDE с вырезанной проверкой (т.е. не в режиме совместимости) выдает имена без пути, хандл модуля у нее все время равен 0. Таким образом, вопрос: как получить полное имя к файлу, зная только хандл его процесса под XP? Конечно, можно было бы полчаса порыться в MSDN, но мне лень, наверняка кто-то вспомнит это быстрее :)

Ответить

Номер ответа: 5
Автор ответа:
 Macronix



ICQ: 170650558 

Вопросов: 12
Ответов: 46
 Web-сайт: http://x250.net/
 Профиль | | #5
Добавлено: 12.04.04 12:52

А у меня с CreateMutex получилось:

Объявляем глобальную переменную:

GLOBAL hMutex AS LONG

А это пишем в WinMain:

DIM szTemp AS ASCIIZ * %MAX_PATH

szTemp = "Моя программа"

hMutex = CreateMutex (BYVAL %NULL, 0, szTemp)

IF hMutex = %NULL THEN EXIT FUNCTION

IF GetLastError = %ERROR_ALREADY_EXISTS THEN EXIT FUNCTION

А при выходе надо все удалить:

CALL ReleaseMutex (hMutex)

CALL CloseHandle (hMutex)

(Тестировал на XP)

Кстати, с определением пути все получилось, спасибо ;)

P.S.

Вариант FindWindow пригоден только если программа содержит Окна.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам