Не удалось совместно использовать объект ядра Windows Event между процессами C ++ и VB - PullRequest
0 голосов
/ 14 октября 2010

Я нахожусь в Windows 7 x64 и пытаюсь использовать один и тот же объект Event между двумя процессами, один - приложение vb, а другой - приложение C ++, но кажется, что событие, созданное в одном процессе, не может быть распознано в еще один:

VB

Option Explicit

Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type

Private Declare Function OpenEvent Lib "Kernel32" Alias "OpenEventW" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, lpName As String) As Long


Const EVENT_ALL_ACCESS = &H1F0003

Sub Testing()
    Dim hCallEvent As Long
    hCallEvent = OpenEvent(EVENT_ALL_ACCESS, 0, "GUID_Call_Event")
End Sub


Private Sub Form_Load()
    Call Testing
End Sub

C ++

int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE hEvent = ::CreateEvent(NULL, FALSE, FALSE, _T("GUID_Call_Event"));

    DWORD dwError = ::GetLastError();
    return 0;
}

Теперь, если я запускаю приложение C ++, чтобы создать событие, а затем запускаю приложение vb, чтобы получить это событие, оно просто завершается ошибкой с сообщением об ошибке: «Система не может найти указанный файл».

Примечание:

  • При взаимодействии с процессом C ++ произошел сбой как с VB, так и с VBA, но он был успешным между двумя процессами C ++
  • Событие, созданное в VB, также невозможно идентифицировать в процессе C ++.

У вас есть идеи по этому поводу?

1 Ответ

2 голосов
/ 14 октября 2010

Вы пытаетесь использовать OpenEventW в VB6.

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

Private Declare Function OpenEvent Lib "Kernel32" Alias "OpenEventA" _
  (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal lpName As String) As Long 

Но, если вы действительно хотите использовать OpenEventW, вы должны сделать это:

Private Declare Function OpenEvent Lib "Kernel32" Alias "OpenEventW" _
  (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal lpName As Long) As Long 

, а затем

hCallEvent = OpenEvent(EVENT_ALL_ACCESS, 0, StrPtr("GUID_Call_Event"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...