Articles of 互操作

CoCreateInstance在.NET中精确匹配?

我有进程(DLL)的COM服务器,但我解决了作为DllSurrogate运行,由于这个原因从非托pipe代码(delphi)我有: function TComWrapper.GetServer: IUnknown; begin OleCheck(CoCreateInstance(ServerData^.ClassId, nil, CLSCTX_LOCAL_SERVER, IUnknown, Result)); end; 从C#使用现在: [DllImport("ole32.dll", EntryPoint = "CoCreateInstance", CallingConvention = CallingConvention.StdCall)] static extern UInt32 CoCreateInstance([In, MarshalAs(UnmanagedType.LPStruct)] Guid rclsid, IntPtr pUnkOuter, UInt32 dwClsContext, [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid, [MarshalAs(UnmanagedType.IUnknown)] out object rReturnedComObject); … UInt32 dwRes = CoCreateInstance(ClassIdGuid, IntPtr.Zero, (uint)(CLSCTX.CLSCTX_LOCAL_SERVER), //if OR with CLSCTX_INPROC_SERVER then INPROC Server will be created, […]

COM +库应用程序的目的是什么?

创buildCOM +应用程序时,向导会提供在库和服务器应用程序之间进行select。 一个服务器应用程序在一个单独的进程中被激活,这可以用来廉价地使64位消费者与32位进程内COM组件互操作。 在调用者进程中被激活的库应用程序有什么用处? 为什么使用它们而不是简单的旧的进程内COM服务器?

在第三方应用程序中模拟用户input

不知道从哪里开始这个… 我正在考虑创build一个小的应用程序来自动化一些重复的文本input。 我希望能够定义文本片段,并在需要时将其注入到其他应用程序中。 解决这个问题最好的办法是什么? 我偶然发现了UI Automation以及SendKeys。 有什么build议么? 我不介意是否必须“指出”应用程序的input控件(如Mac的原生截图工具要求您单击要捕获的窗口)。 例如,我可以在这个应用程序中select文本片段,然后点击我的其他应用程序的文本input框,这将以某种方式让第一个应用程序获得input控件的句柄,然后模拟input。 另外,是否有任何方法以编程方式“提交”一旦填写的控制forms? 我来自一个网页devise背景,所以很多这个本地应用程序开发对我来说是新的。 对不起,如果这是一个模糊的问题,我只是不知道从哪里开始,这…

代理/存根是暴露接口?

假设我介绍了一个COM接口,并且不希望任何第三方使用它 。 我完全控制了COM组件和保存接口定义的IDL文件的来源。 我的COM组件将需要编组的东西来回接口,所以我需要实现IMarshal或提供一个typelib或提供一个代理/存根(stub) 。 显然,如果我提供一个typelib,任何人都可以检查它,并find我的界面是什么以及如何使用它。 这不是我想要的。 如果我使用代理/存根? 它会暴露的接口,让任何人检查它或将保持接口的细节隐藏?

发送消息到Windows进程(而不是它的主窗口)

我有一个应用程序,在随后的开始检测是否有一个进程已经运行相同的名称,如果是这样,激活正在运行的应用程序的窗口,然后退出。 问题是主窗口可能被隐藏(只有通知区域图标可见),因此没有窗口句柄。 在启动时,以前的实例的MainWindowHandle属性是0,所以我不能发送ShowWindow或PostMessage 。 有什么办法可以发送消息,可以拦截运行的应用程序,从而使其显示其主窗口? 该应用程序是用C#编写的,我正在使用下面的代码来实现这一点。 [STAThread] static void Main() { bool createdNew = true; using (Mutex mutex = new Mutex(true, "MyMutexName", out createdNew)) { if (createdNew) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); } else { Process current = Process.GetCurrentProcess(); foreach (Process process in Process.GetProcessesByName(current.ProcessName)) { if (process.Id != current.Id) { Interop.WINDOWINFO pwi = new Interop.WINDOWINFO(); […]

在C#中使用SetWindowPos来移动窗口

我有下面的代码: namespace WindowMover { using System.Windows.Forms; static class Logic { [DllImport("user32.dll", EntryPoint = "SetWindowPos")] public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags); public static void Move() { const short SWP_NOMOVE = 0X2; const short SWP_NOSIZE = 1; const short SWP_NOZORDER = 0X4; const int SWP_SHOWWINDOW […]

从c#注册一个自定义的win32窗口类

我有一个用WPF编写的新应用程序需要支持一个旧的API,它允许它接收一个已经发布到隐藏窗口的消息。 通常,另一个应用程序使用FindWindow来使用自定义窗口类的名称来标识隐藏窗口。 1)我假设实现一个自定义的窗口类,我需要使用老派的win32调用? 我的旧的c + +应用程序使用RegisterClass和CreateWindow使最简单的可能不可见的窗口。 我相信我应该能够在c#中完成相同的工作。 我不希望我的项目必须编译任何非托pipe代码。 我已经尝试从System.Windows.Interop.HwndHostinheritance并使用System.Runtime.InteropServices.DllImport来引入上述API方法。 这样做,我可以成功地举办一个标准的Win32窗口,如WPF内的“列表框”。 但是,当我为我的自定义窗口调用CreateWindowEx时,它总是返回null。 我的RegisterClass调用成功,但我不知道我应该设置WNDCLASS.lpfnWndProc成员。 2)有谁知道如何成功地做到这一点?

如何将VARIANT_BOOL转换为C ++ bool?

当使用COM时,布尔值将作为在wtypes.h中声明的VARIANT_BOOL传递。 还有预定义的真值和假值: #define VARIANT_TRUE ((VARIANT_BOOL)-1) #define VARIANT_FALSE ((VARIANT_BOOL)0) 将VARIANT_BOOL转换为C ++ booltypes的最佳方法是什么? 明显的变体是: 与VARIANT_FALSE比较 简单地投给布尔 其他方式可以很容易地发明。 哪种方法是最好的 – 最可读性,最符合标准的兼容性,最不容易受到错误植入的问题,而且最不容易出现移植到64位平台的问题。

帮助:从VB6项目调用C#winforms dll?

我有一个VB6项目(Windows应用程序),我不得不在C#.net现有的VB6项目中重新开发一个模块。 我在C#.net开发的模块应该是一个DLL,并应包含一些Windows窗体。 我能够成功地从我的VB6项目调用AC#控制台应用程序的DLL,但我面临的问题,当我尝试从我的VB6项目调用Winforms的C#类库。 这就是我为我的概念certificate所做的 – 这是我的C#.net类库项目中的一个类文件。 namespace TestDll { public interface IClass1 { void DisplayMessage(); } public class Class1:IClass1 { void IClass1.DisplayMessage() { MessageBox.Show ("Displyaing message"); } } } 我在同一个nemspace有一个表单,我打算实例化Class1并在C#winform的page_load事件上使用它的对象。 在我的VB6项目中,我想显示我在C#.net dll中的表单。 我用这个代码调用它 – Private Declare Sub DislayMessage Lib "TestDll.dll" () Private Sub Command1_Click() //On button click event of the VB6 windows form DislayMessage End […]

使用.NET代码将系统时间同步到域控制器

我有基于时间的testing运行,需要在testing过程中多次更改系统时间。 我希望能够在testing结束时重新同步到域控制器的时间。 我有任何使用.NET代码(C#)的方法。 我正在改变时间使用p-invoke函数中find: 以编程方式使用C# 谢谢