Articles of 互操作

WPF相当于Application.AddMessageFilter(Windows窗体)

我在我的WinForms应用程序(使用非托pipe代码时)使用Application.AddMessageFilter() )。 现在我切换到WPF ,无法find这个function。 请咨询哪里可以find或实施。

如何从Ocaml使用自己的共享库.so调用C ++代码?

我需要build立一个调用共享对象(Linux下的.so)的Ocaml / C ++模块, 只要编译一个简单的Ocaml / C ++存根就是一个问题,我pipe理这个东西,但是当我需要将.so和ocamlmklib或者ocamlopt连接起来的时候,它会失败 我在gcc 4.5下工作(c ++ 0x) 共享对象的文件: hello.hpp #include <iostream> #include <string> using namespace std; class HelloApplication { public : HelloApplication(); ~HelloApplication(); void say(string s); }; typedef HelloApplication *(*create_hello)(); hello.cpp: #include "hello.hpp" HelloApplication::HelloApplication(){} HelloApplication::~HelloApplication(){} void HelloApplication::say(string s) { cout << "Hello : " << s << endl; } extern […]

如何将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# 谢谢

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(); […]