我正在使用C#中的一些COM对象,其中一个有一个名为SetLogFile的函数,它接受一个IntPtr。如何在C#中创建文件,然后将其作为IntPtr传递给该COM函数?
编辑:该函数需要一个打开的文件句柄:http://msdn.microsoft.com/en-us/library/aa915939.aspx
答案 0 :(得分:4)
关于你必须传递什么作为“文件”你有点模糊 - 如果你有一个FileStream你可以将FileStream.Handle交给IntPtr(假设它期望一个HANDLE值)
请参阅“How to pass parameters of Type HANDLE from C# to C++ DLL”。
答案 1 :(得分:2)
这在很大程度上取决于SetLogFile
方法期望接收IntPtr
参数的确切内容。如果它期望COM对象和C#方法实现适当的接口,您可以使用以下内容来传递变量。
var ptr = Marshal.GetIUnknownForObject(theParameter);
try {
theComObject.SetLogFile(ptr);
} finally {
Marshal.Release(ptr);
}
如果它期待一个真正的Win32句柄。您需要浏览文件系统API以获取文件的句柄,然后将其传递给方法。
答案 2 :(得分:0)
您可以使用FileStream对象的SafeFileHandle属性。不过,我不确定这样做的后果,所以P / Invoke CreateFile可能更安全。