Tag: interop

COM返回未实现任何接口的类型

我需要从.NET 4.0应用程序中自动执行Adobe InDesign CS3中的某些任务。 我使用Visual Studio中的“添加引用”对话框添加了对InDesign类型库的引用。 它创建了一个interop程序集,它正确地包含了类型库中声明的所有接口和类型。 我没有安装任何Adobe SDK,因为Visual Studio中提供的类型库没有安装除Adobe InDesign CS3之外的任何东西。 对我来说,interop程序集中有趣的类型是接口_Application和Application ,以及类ApplicationClass 。 以下是它们的定义,因此您可以看到它们之间的关系: public interface _Application { // Lots of properties and methods } public interface Application : _Application { // Empty } public class ApplicationClass : _Application, Application { // The same properties and methods as declared in _Application } 我尝试像这样实例化COM对象: […]

32位与64位版本类型的条件编译的首选方法

我需要某个任务来枚举系统中的所有句柄。 到目前为止,我发现的最好的方法是使用带有SystemHandleInformation标志的underdocumented NtQuerySystemInformation作为类参数。 到现在为止还挺好。 但是,在64位Windows上以32位模式运行它,所需的结构如下: // 32-bit version [StructLayout(LayoutKind.Sequential, Pack=1)] public struct SYSTEM_HANDLE_INFORMATION { public uint ProcessID; public byte ObjectTypeNumber; public byte Flags; public ushort Handle; public uint Object_Pointer; public UInt32 GrantedAccess; } 而对于64位Windows(x64,我没有测试Itanium,我希望没有什么不同……),结构如下: // 64-bit version [StructLayout(LayoutKind.Sequential, Pack=1)] public struct SYSTEM_HANDLE_INFORMATION { public int Reserved; // unknown, no documentation found public uint ProcessID; public […]

如何从Win32句柄获取System.Windows.Form实例?

以下代码实现了一个简单的单例,确保只能运行我的应用程序的一个实例。 但是,如果启动了另一个实例,我需要能够获取该实例的命令行参数,将它们传递给初始实例,然后终止第二个实例。 当我试图获取应用程序的第一个实例时,会出现此问题。 一旦我找到该实例的主窗体的句柄,我将它传递给Control.FromHandle()方法,期望得到一个MainForm 。 相反,返回值始终为null 。 ( Control.FromChildHandle()给出相同的结果。) 因此,我的问题很简单:我做错了什么? 这在.NET中甚至可能吗? public class MainForm : Form { [DllImport(“user32”)] extern static int ShowWindowAsync(IntPtr hWnd, int nCmdShow); [DllImport(“user32”)] extern static bool SetForegroundWindow(IntPtr hWnd); private Mutex singletonMutex; private void MainForm_Load(object sender, EventArgs e) { bool wasCreated; singletonMutex = new Mutex(false, Application.ProductName + “Mutex”, out wasCreated); // returns false […]

固定.NET对象数组

我想固定.NET对象(包括对象)的数组,以允许本机函数对对象进行一些处理。 据我所知,GCHandle.Alloc()不允许我这样做,因为这样的数组包含引用(并且对象也可能包含引用),这些引用不是blittable。 有没有其他选择来实现这一目标? 对于非常黑客的建议或需要Mono的建议我会没事的。

从C#调用非托管函数:我应该传递StringBuilder还是使用不安全的代码?

我有一个C#程序需要将char缓冲区传递给非托管函数。 我发现两种似乎可靠的方法,但我不确定我应该选择哪种方式。 这是非托管函数的签名。 extern “C” __declspec(dllexport) int getNextResponse(char *buffer); 第一个选项是将缓冲区定义为StringBuilder,如下所示。 //at class level… [DllImport(“mydll.dll”)] static extern int getNextResponse(StringBuilder buffer); //in main method body… StringBuilder sb = new StringBuilder(” “, 65536); int rc = getNextResponse(sb); 这很简单,它可以工作,我想我基本上理解为什么它可以工作,因为StringBuilder在幕后有一个缓冲区,所以(我假设)interop层只是将StringBuilder编组为char *。 另一种选择是使用不安全的代码。 //at class level… [DllImport(“mydll.dll”)] static extern int getNextResponse(byte* buffer); //separate method… private static unsafe int runGetNextResponse(byte[] buffer) { […]

挂钩进入事件时C#中的COMException

我试图挂钩COM对象上的事件时收到COMexception。 这是我试图执行的代码。 COMClass a = IComClass as ComClass; a.SomeEvent += new SomeEvent_EventHandler(MethodNameHere); 第二行使用以下信息抛出COMException类型的exception: System.Runtime.InteropServices.COMException被捕获 消息=“来自HRESULT的exception:0x80040202” 来源= “mscorlib程序” 错误码= -2147220990 StackTrace:at System.Runtime.InteropServices.ComTypes.IConnectionPoint.Advise(Object pUnkSink,Int32&pdwCookie) 有没有人有任何想法,为什么我无法挂钩到COM事件或有一个解决方法来挂钩COM事件? 克里斯

C#Outlook 2007 COM互操作应用程序不退出!

任何想法为什么以下代码不退出通过COM互操作创建的Outlook 2007进程? Microsoft.Office.Interop.Outlook.Application app = new Microsoft.Office.Interop.Outlook.Application(); var item = app.Session.OpenSharedItem(“C:\\test.msg”) as Microsoft.Office.Interop.Outlook.MailItem; string body = item.HTMLBody; int att = item.Attachments.Count; (item as Microsoft.Office.Interop.Outlook._MailItem).Close(Microsoft.Office.Interop.Outlook.OlInspectorClose.olDiscard); System.Runtime.InteropServices.Marshal.ReleaseComObject(item); (app as Microsoft.Office.Interop.Outlook._Application).Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(app); System.Diagnostics.Debugger.Break(); 一个几乎相同的使用Word的片段工作,所以我想知道我是否忘记清理一些东西……

我如何在struct中声明数组?

如何在其中声明具有固定大小数组的结构? 我找到了解决方案,但它只适用于原始数据类型。 我需要我的数组是MyStruct类型。 那么如何在其中声明一个包含其他结构数组的结构? 恩。 unsafe struct Struct1{ fixed int arrayInt[100]; // works properly fixed Struct2 arrayStruct[100]; //not compile }

从VBScript调用.NET COM对象

我使用的是VS 2008和Windows 7。 得到一个.NET C#类,它作为COM对象公开。 [Guid(“E5014B85-FCB2-4F0D-95EC-F741395A7923”)] [InterfaceType(ComInterfaceType.InterfaceIsDual)] public interface DSystem { [DispId(1610809354)] void setProperties(IDictionary propertymap); } 从VBScript调用COM对象 dim dSystem set dSystem = CreateObject(“MYCOMOBJECT”) Dim objDictionary Set objDictionary = CreateObject(“System.Collections.Hashtable”) objDictionary.Add “PROP1”, “abc” objDictionary.Add “PROP2”, “zyx” dSystem.setProperties(objDictionary) 一切正常……但是,返回类型从void变为bool [DispId(1610809354)] bool setProperties(IDictionary propertymap); 和 success = dSystem.setProperties(objDictionary) 导致错误 Microsoft VBScript运行时错误“800a0005” 无效的过程调用或参数 .tlb文件似乎没问题 [id(0x6003000a)] HRESULT setProperties( [in] IDictionary* […]

如何使用C#中的struct pointer参数调用C ++函数?

还有一个function,它还没有工作。 我基本上是通过使用P / Invoke从C#调用一些C ++函数。 有问题的function确实向显示激光设备查询一些设备相关信息,例如最小和最大扫描速率以及每秒最大点数。 有问题的function是: int GetDeviceInfo(DWORD deviceIndex, DeviceInfo* pDeviceInfo); 这是我给出的C ++头文件。 这是非常简短的C ++ SDK描述的链接 。 我没有重建DLL文件的源代码,我也没有* .pdb文件(制造商无法提供): #pragma once #ifdef STCL_DEVICES_DLL #define STCL_DEVICES_EXPORT extern “C” _declspec(dllexport) #else #define STCL_DEVICES_EXPORT extern “C” _declspec(dllimport) #endif enum SD_ERR { SD_ERR_OK = 0, SD_ERR_FAIL, SD_ERR_DLL_NOT_OPEN, SD_ERR_INVALID_DEVICE, //device with such index doesn’t exist SD_ERR_FRAME_NOT_SENT, }; #pragma pack […]