Застрял с API OpenProcess

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

GDK
Обычный пользователь
Обычный пользователь
 
Сообщения: 80
Зарегистрирован: 23.10.2008 (Чт) 16:15

Застрял с API OpenProcess

Сообщение GDK » 30.08.2010 (Пн) 14:31

Перевожу рабочий код с VBA на .net

Вкратце: Нужно считать текст из статусбара стороннего приложения, написанного на C++, которое вроде как не поддерживает COM. Ну и ваще управлять некоторыми его возможностями.

Это приложение запускаю с помощью класса Process т.е. знаю его хендл и PID. Чтобы открыть процесс надо использовать OpenProcess, а она выдаёт хендл не совпадающий с тем, что в объекте класса Process. GetLastError выдаёт 2 - не найден файл.

Что бы это могло значить? И как с этим бороться?

Для работы с апи сделал класс:
Dim API As New WAPI32.WinApi32

В нём объявлена
Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Boolean, ByVal dwProcessId As IntPtr) As Integer

Можно ли открыть процесс для записи/чтения в его память другими ср-вами (лучше если только ср-вами .нет), зная его PID & HWnd?

Код: Выделить всё
        Public ReadOnly Property RezMousPos() As String
            Get
                Dim rwb As Integer
                Dim procid As Integer

                Dim hProcess As Integer
                Dim L As Integer
                Dim prc As Integer  ' указатель на выделенную память
                Dim HWndStBrf As Integer
                Dim s() As Byte

                Dim API As New WAPI32.WinApi32
                Dim C As WAPI32.ConstAPI32
                Dim GCH As System.Runtime.InteropServices.GCHandle

                HWndStBrf = Me.WinParBasic.HWnd

                'GCH = System.Runtime.InteropServices.GCHandle.Alloc(procid)

                API.GetWindowThreadProcessId(Me.WinParBasic.HWnd, procid)  ' найти PID окна msctls_statusbar32
                'GCH.Free()
                hProcess = API.OpenProcess(C.PROCESS_ALL_ACCESS Or C.PROCESS_DUP_HANDLE, False, Me.GNAppParent.GNProcF.Id) ' получить хендл процесса
                Debug.Print(System.Runtime.InteropServices.Marshal.GetLastWin32Error())
                hProcess = Me.GNAppParent.GNProcF.Handle
                L = API.SendMessage(HWndStBrf, C.SB_.SB_GETTEXTLENGTHA, 4, 0) ' длина строки первой панели  // SendMessage(HWndStBrf, SB_GETTEXTLENGTHA, 1, 0) - вторая панель
                If L = 0 Then L = 1
                ReDim s(L - 1)
                GCH = System.Runtime.InteropServices.GCHandle.Alloc(s)
                prc = API.VirtualAllocEx(hProcess, 0, L, C.MEM_.MEM_COMMIT Or C.MEM_.MEM_TOP_DOWN, C.PAGE_READWRITE)    'выделить память
                Debug.Print(System.Runtime.InteropServices.Marshal.GetLastWin32Error())
                '   Debug.Print "StatusBar prc - " & prc
                API.SendMessage(HWndStBrf, C.SB_.SB_GETTEXTA, 4, prc)   ' получить текст первой панели //SendMessage(HWndStBrf, SB_GETTEXTA, 1, prc) - вторая
                API.ReadProcessMemory(hProcess, prc, GCH, L, rwb)     'прочитать из памяти
                API.VirtualFreeEx(hProcess, prc, L, C.MEM_.MEM_RELEASE) 'освободить память
                API.CloseHandle(hProcess)
                GCH.Free()

                Return ""

            End Get
        End Property


ЗЫ: Могли бы MS-ники в классе Process предусмотреть работу с памятью и проч., раз уж класс такой сделали, а то как то на недоделку смахивает.
Может есть где-нибудь уже в исходниках усовершенствованная версия?

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Застрял с API OpenProcess

Сообщение Admiralisimys » 03.09.2010 (Пт) 16:43

GDK быть может тогда имеет смысл запускать с помощью Win32 Api CreateProcess(), коль без Апи никак?

Dakovalev1
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 23.02.2010 (Вт) 14:16

Re: Застрял с API OpenProcess

Сообщение Dakovalev1 » 05.09.2010 (Вс) 14:35

попробуй пошарить тут http://www.codeproject.com/KB/miscctrl/ ... t_orb.aspx. Там на c# на висте пуск прячут, но принцип тот же. Думаю тебе это поможет.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Застрял с API OpenProcess

Сообщение FireFenix » 05.09.2010 (Вс) 17:23

Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 37

    TopList