Надежно найти путь к процессу ... Win XP, Vista и 7 - PullRequest
0 голосов
/ 08 марта 2011

Все,

Я исследовал Интернет и нашел более чем несколько потенциальных решений, но продолжаю получать ошибки на компьютере с Windows 7.

Вот совок.У меня есть приложение, написанное на VB.NET, которое запускает консольное приложение.Консольное приложение будет работать независимо от моего приложения VB.NET, поэтому пользователь может закрыть и перезапустить приложение VB.NET и, возможно, запустить второй сеанс консольного приложения из той же установки.

Я нехочу это.Я хочу идентифицировать экземпляры запущенного консольного приложения при запуске моего приложения VB и отключить возможность запуска консольного приложения второй, третий и т. Д.время.Но ... Я хочу отключить эту возможность, только когда консольное приложение было запущено из той же папки, что и приложение VB.NET.

Вот код, который я сейчас использую: Открытая функция CheckForConsoleApp () As Boolean 'Проверить, запущено ли консольное приложение в этой папке.Верните значение true, если это так.

    Dim p() As System.Diagnostics.Process
    p = System.Diagnostics.Process.GetProcessesByName("MyConsoleApp")
    If p.Length = 0 Then return false

    Dim Path As String = My.Application.Info.DirectoryPath
    Dim i As Integer
    For i = 0 To p.Length - 1
        Dim pPath As String = p(i).MainModule.FileName
        pPath = pPath.Substring(0, pPath.LastIndexOf("\"))
        if pPath = Path Then Return True
    Next i

    Return False

End Function

В моей системе (32-разрядная Windows XP) это не проблема, и она работает каждый раз.На 64-битной машине Windows 7 с коллегой генерируется ошибка, что только часть «ReadProcessMemory или WriteProcessMemory» может быть выполнена.Использование файлов журнала и другие попытки показали, что строка:

Dim pPath As String = p(i).MainModule.FileName

- это место, где происходит сбой.

Наше приложение должно работать на компьютерах с Windows 7, Vista и XP, как на 32-разрядных, так и на 64-разрядных платформах.Я обнаружил, что команды WinAPI применяют разрешения на чтение / запись к определенным областям памяти, но они специально использовались с командами API ReadProcessMemory, поэтому мне еще предстоит узнать, как применять подобные команды в .NET.?Спасибо, SH

Ответы [ 2 ]

2 голосов
/ 14 июня 2011

Я не знаю, нашли ли вы свое решение, но вам нужно установить для параметров сборки значение «Любой процессор», а не для X86, тогда оно отлично работает для меня.

0 голосов
/ 08 марта 2011

Я искал решение этой проблемы в течение нескольких дней ... даже недель. Вчера я оставил надежду и разместил здесь вопрос, а сегодня перефразировал мой поиск и нашел то, что звучит как ответ.

Суть в том, что процесс, ищущий данные о других процессах, является процессом x86 и пытается найти данные о процессах x64. Вот почему мое приложение не работает. У кого-нибудь есть предложения как обойти это?

http://social.msdn.microsoft.com/Forums/en/vbgeneral/thread/ca5fc242-fbc0-4b5b-be86-4cbd3824211b?prof=required

Это довольно длинная тема, но если вы ищете "Чарльз" (имя автора сообщения), вы найдете ответ на мой вопрос. Это может не относиться ко всем другим случаям возникновения проблемы, но я думаю, что это то, что происходит с моей.

SH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...