Хотя проблема может заключаться в ANSI / Unicode, API-интерфейсы ANSI работают путем сопоставления строк с Unicode и последующего вызова пути к коду Unicode.Так что это не должно быть проблемой.
При ошибке File Not Found существует несоответствие имени.Попробуйте изменить нативное приложение на использование CreateEvent
(если имя существует, вы получите дескриптор, а GetLastError()
вернет ERROR_ALREADY_EXISTS - таким образом, шаблон CreateEvent
и всегда проверяет последнюю ошибку, чтобы избежать синхронизациизависимости или условия гонки вокруг создания объекта.
Если вы не столкнулись с именем, используйте handle или Process Explorer (оба SysInternals), чтобы посмотреть на событиеобъект, чтобы увидеть, как на самом деле его имя.
ОБНОВЛЕНИЕ
Что произошло (TL: DR: версия):
Сообщая P /Вызовите, что это API-интерфейс ANSI (по умолчанию, если вы не указали Unicode) и скажите, что строка Unicode дает неправильные результаты. Исправление любого из них решило бы проблему.
Полная версия:
Исходное объявление P / Inovoke:
[DllImport("kernel32.dll")]
static extern IntPtr CreateEvent(IntPtr lpEventAttributes, bool bManualReset,
bool bInitialState, [MarshalAs(UnmanagedType.LPWStr)] string lpName);
имеет метод API по умолчанию (ANSI) (поскольку для свойства DllImport
CharSet
по умолчанию установлено значение CharSet.Ansi
) но строка имеет UnmanagedType.LPWStr
: передать ширину (т.е. Unicode) string.
Если вы посмотрите на имя объекта, когда он запущен, вы увидите:
\Sessions\1\BaseNamedObjects\G
, где API только что увидел G
от имени, идобавьте префикс имени сеанса.
Изменение объявления: [DllImport ("kernel32.dll")] static extern IntPtr CreateEvent (IntPtr lpEventAttributes, bool bManualReset, bool bInitialState, [MarshalAs (UnmanagedType.LPSt))] string lpName);
передача строки ANSI в API ANSI или
[DllImport("kernel32.dll", CharSet=CharSet.Unicode)]
static extern IntPtr CreateEvent(IntPtr lpEventAttributes, bool bManualReset,
bool bInitialState, [MarshalAs(UnmanagedType.LPWStr)] string lpName);
передача строки Unicode в API Unicode, обе работают с созданным именем объекта:
\BaseNamedObjects\unique_id_string
(Global
- псевдоним в дереве объектов ядра для BaseNamedObjects
.)
Сводка:
Объявления P / Invoke должны быть на 100% правильными.... даже один символ имеет значение.