Создайте файл в C # и передайте его как IntPtr в COM-объект - PullRequest
3 голосов
/ 29 января 2010

Я работаю с некоторыми COM-объектами в C #, у одного из них есть функция SetLogFile, которая принимает IntPtr. Как я могу создать файл в C # и передать его как IntPtr этой функции COM?

РЕДАКТИРОВАТЬ: функция требует дескриптор открытого файла: http://msdn.microsoft.com/en-us/library/aa915939.aspx

Ответы [ 3 ]

4 голосов
/ 29 января 2010

Вы немного расплывчаты в отношении того, что вы должны передать как "файл" - если у вас есть FileStream, вы можете передать FileStream.Handle как IntPtr (при условии, что он ожидает значение HANDLE)

См. " Как передать параметры типа HANDLE из C # в C ++ DLL ".

2 голосов
/ 29 января 2010

Это сильно зависит от того, что именно метод SetLogFile ожидает получить для параметра IntPtr. Если он ожидает COM-объект и метод C # реализует соответствующий интерфейс, вы можете использовать следующее для передачи переменной.

var ptr = Marshal.GetIUnknownForObject(theParameter);
try {
  theComObject.SetLogFile(ptr);
} finally {
  Marshal.Release(ptr);
}

Если он ожидает фактического дескриптора Win32. Вам нужно будет пройти через API файловой системы, чтобы получить дескриптор файла, а затем передать его в метод.

0 голосов
/ 29 января 2010

Возможно, вы могли бы использовать SafeFileHandle свойства объекта FileStream. Однако я не уверен в последствиях этого, поэтому для P / Invoke CreateFile было бы безопаснее.

...