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