Tag: interop

如何从控制台应用程序处理COM事件?

我正在使用来自第三方库的COM对象来生成定期事件。 当我使用Winforms应用程序中的库,将对象作为类成员并在主窗体线程中创建它时,一切正常。 但是,如果我从另一个线程创建对象,我不会收到任何事件。 我的猜测是我需要在用于创建对象的同一个线程中有某种事件循环。 我需要从控制台应用程序中使用此对象。 我想我可以使用Application.DoEvents,但我宁愿不在控制台App中包含Winforms命名空间。 我怎么解决这个问题? 更新3(2011-06-15):供应商终于回答了。 简而言之,他们说Application.Run创建的消息泵与Thread.Join创建的消息泵之间存在一些差异,但他们不知道这有什么区别。 我同意他们; 任何关于此事的光明都会非常感激。 更新: 从理查德评论到mdm回答: 如果其他组件是单线程并从MTA实例化,则Windows将创建工作线程+窗口+消息泵并执行必要的编组。 试着听从他的建议,我正在做以下事情: 更新2: 我改变了JoãoAngelo回答后的代码。 using System; namespace ConsoleApplication2 { class Program { [STAThread] static void Main(string[] args) { MyComObjectWrapper wrapper = new MyComObjectWrapper(); } } class MyComObjectWrapper { MyComObject m_Object; AutoResetEvent m_Event; public MyComObjectWrapper() { m_Event = new System.Threading.AutoResetEvent(false); System.Threading.Thread t = […]

当Visual Studio具有焦点(或任何以管理员身份运行的应用程序)时,keybd_event以及PostMessage win32无法正常工作

这是一个程序,我已经使用了旧的xp日的许多变化它是一个cmd行程序,它将改变媒体应用程序(Spotify,vlc,mediaPlayer)中的跟踪,就像具有下一个/上一个跟踪按钮的键盘一样。 目前我正在使用微软自然键盘,它没有那些按钮,但有可执行此编程的可编程键。 当Visual Studio 2012/2013具有焦点(Windows 7)(尚未尝试其他版本)时,这一切都有效,并且它适用于Sql管理工作室。 using System; using System.Runtime.InteropServices; namespace NxtTrack { class Program { [DllImport(“user32.dll”)] private static extern bool PostMessage(IntPtr hWnd, uint Msg, UIntPtr wParam, IntPtr lParam); [DllImport(“user32.dll”)] public static extern void keybd_event(byte vkCode, byte scanCode, int flags, IntPtr extraInfo); enum TrackMove { Previous,Next } static void Main(string[] args) { TrackMove trackMove; try […]

在c#中的任意起始索引上初始化数组

是否可以在c#中初始化一个数组,例如,subindex 1? 我正在使用Office互操作,并且每个属性都是一个从1开始的对象数组(我假设它最初是在VB.NET中编写的),你不能修改它,你必须设置整个数组才能接受它变化。 作为一种解决方法,我正在克隆原始数组,修改那个数组,并在完成后将其设置为整体。 但是,我想知道是否有可能创建一个新的非零基数组

将C#委托的调用约定更改为CDECL

当我使用DotNet1.1时,我遇到了C#的这个问题 问题是这个。 我有一个非托管的DLL,它有一个函数,它接受一个函数指针(以及其他参数)。 当我在C#代码中声明DLLImport时,我传递了一个委托。 但是C#中的委托具有stdcall调用约定,而非托管函数需要cdecl函数指针。 因此,我天真的方法导致了崩溃。 然后我找到了以下内容: http : //www.codeproject.com/KB/cs/cdeclcallback.aspx有些人编写了一个优秀的库,可以根据我的理解改变代理的调用约定,MSIL-hacking。 事情进展顺利,直到…… 我迁移到VS2008和新版本的.NET。 在此版本下,上述库不起作用。 我不是真正的C#或.NET专家,说实话,我几乎不了解他的库做了什么(尽管它是开源的),所以我甚至不想尝试将它适应新的.NET。 但是,我希望更新版本的C#可以为我的问题提供更好的解决方案。 那么,SO专家,请帮我解决臀部疼痛:)

外部应用程序中文本框的SetText。 Win32 API

使用Winspector我发现我要更改的子文本框的ID是114.为什么这段代码不能更改TextBox的文本? [DllImport(“user32.dll”)] static extern IntPtr GetDlgItem(IntPtr hDlg, int nIDDlgItem); [DllImport(“user32.dll”)] public static extern int SendMessage(IntPtr hWnd, int msg, int Param, string s); const int WM_SETTEXT = 0x000c; private void SetTextt(IntPtr hWnd, string text) { IntPtr boxHwnd = GetDlgItem(hWnd, 114); SendMessage(boxHwnd, WM_SETTEXT, 0, text); }

将矢量/数组从非托管C ++传递到C#

我想从非托管C ++传递大约100 – 10,000点到C#。 C ++端看起来像这样: __declspec(dllexport) void detect_targets( char * , int , /* More arguments */ ) { std::vector id_x_y_z; // Now what’s the best way to pass this vector to C# } 现在我的C#端看起来像这样: using System; using System.Runtime.InteropServices; class HelloCpp { [DllImport(“detector.dll”)] public static unsafe extern void detect_targets( string fn , /* More […]

如何将可空类型传递给P /被调用函数

我有几个p /被调用的函数(但我现在正在重写我的代码所以我正在整理)我想知道如何使用/传递一个可空类型作为参数之一。 使用int类型不是问题,但给出以下内容: [DllImport(“setupapi.dll”, CharSet = CharSet.Auto, SetLastError = true)] static extern IntPtr SetupDiGetClassDevs(ref Guid ClassGuid, int? enumerator, IntPtr hwndParent, uint Flags); 我希望能够将Guid参数作为可空类型传递。 目前我可以将其称为: SetupDiGetClassDevs(ref tGuid, null, IntPtr.Zero, (uint)SetupDiFlags.DIGCF_PRESENT ); 但我需要第一个参数也可以作为null传递。

在C / C ++中编写DLL以实现.Net互操作性

在我的C#应用​​程序中,我想在C中编写一部分代码。我计划编写一个可与​​.Net互操作的DLL。 我怎样才能做到这一点?

通过Interop / pinvoke传递C#回调函数

我正在编写一个C#应用程序,它使用Interop服务来访问本机C ++ DLL中的函数。 我已经使用了大约10种不同的function。 现在我不知道如何处理将回调作为参数传递,以便DLL可以调用我的代码。 这是DLL的函数原型: typedef void (WINAPI * lpfnFunc)(const char *arg1, const char *arg2) 并且允许我传递上述类型的函数: int WINAPI SetFunc(lpfnFunc f) 这是委托和函数定义的C#代码: public delegate void Func(string arg1, string arg2); public static void MyFunc(string arg1, string arg2) 这是我的SetFunc Interop函数的C#代码: [DllImport(“lib.dll”, CharSet = CharSet.Ansi)] public static extern int SetFunc(Func lpfn); 最后这里是我调用SetFunc函数并将其传递给我的回调的代码: SetFunc(new Func(MyFunc)); 不幸的是,我的function应该被调用。 SetFunc函数的返回值是返回Success的错误代码,所以要么它没有调用我的函数,要么因为我的代码错误而无法正常工作。

释放临时COM对象

使用COM对象考虑以下C#代码。 MyComObject o = new MyComObject; try { var baz = o.Foo.Bar.Baz; try { // do something with baz } finally { Marshal.ReleaseComObject(baz); } } finally { Marshal.ReleaseComObject(o); } 这将释放COM对象o和baz ,但不释放由o.Foo和o.Foo.Bar的临时对象。 当这些对象拥有大量非托管内存或其他资源时,这可能会导致问题。 一个明显但丑陋的解决方案是,使用try-finally和Marshal.ReleaseComObject使代码更加混乱。 请参阅C#+ COM Interop,确定性版本 作为一种解决方法,我创建了一个帮助类 class TemporaryComObjects: IDisposable { public C T(C comObject) { m_objects.Add(comObject); return comObject; } public void Dispose() { foreach […]