Tag: interop

如何将.NET 4 WinForm应用程序分配给Delphi 7表单的所有者属性?

我需要指定一个.NET 4 Winform应用程序作为Delphi 7表单的所有者。 我在Delphi中创建了一个包含表单的.dll。 Delphi .dll导出用于创建和显示表单的方法。 我已经在我的.NET应用程序中成功加载了Delphi .dll,并显示了表单。 现在我需要能够将.NET应用程序(或.NET应用程序的主要forms)指定为Delphi表单的所有者。 我之前创建了一个Delphi应用程序,它通过COM与.NET交互,并使用以下类将Delphi应用程序指定为.NET表单的所有者: public class WindowHandleWrapper : IWin32Window { public HandleRef m_Handle; public IntPtr Handle { get { return m_Handle.Handle; } } public WindowHandleWrapper(IntPtr handle) { m_Handle = new HandleRef(this, handle); } } Delphi应用程序句柄作为整数传递给WindowHandleWrapper构造函数。 我怀疑解决方案是类似的,例如将句柄传递给Delphi作为整数。 但是,表单的Owner属性的Delphi类型是TComponent。 我只是不确定如何将.NET句柄指定为Delphi表单的所有者。 有任何想法吗?

COM Interop挂起冻结整个COM系统。 如何取消COM通话

我正在使用通过COM Interop包装器公开的第三方dll。 但是,其中一个COM调用经常冻结(至少不会返回)。 为了尝试至少使我的代码更健壮,我异步地包装了调用( _getDeviceInfoWaiter是一个ManualResetEvent ) var backgroundWorker = new BackgroundWorker(); backgroundWorker.DoWork += (sender, eventArgs) => { var deviceInfo = _myCom.get_DeviceInfo(0); _serialNumber = deviceInfo.SerialNumber; _getDeviceInfoWaiter.Set(); }; backgroundWorker.RunWorkerAsync(); var waitFifteenSecondsForGetInfo = new TimeSpan(0, 0, 0, 15); _getDeviceInfoWaiter.WaitOne(waitFifteenSecondsForGetInfo, true); if(String.IsNullOrEmpty(_serialNumber)) throw new ArgumentNullException(“Null or empty serial number. ” + “This is most likely due to the get_DeviceInfo(0) […]

使用C#邮件合并(Excel到Word)

我想知道是否有人知道如何使用Excel文件作为数据源进行邮件合并,以填写Word模板上的字段? 如果可以的话,我希望使用interop for Word …但是在找到代码时遇到一些困难。 有没有人有这方面的语法? 先感谢您。

EnumResourceNames问题 – 未知错误

我最近使用二级库/二进制模块的资源,遇到了一个奇怪的错误。 我有两个本机WinAPI引用: [DllImport(“kernel32.dll”, SetLastError = true)] public extern static bool EnumResourceNames(IntPtr hModule, int lpszType, EnumResNameProc lpEnumFunc, IntPtr lParam); [DllImport(“kernel32.dll”, SetLastError=true)] public extern static IntPtr LoadLibraryEx(string lpFileName, IntPtr hFile, int dwFlags); 当我调用LoadLibraryEx时,我正在获取IntPtr实例 – 正是我需要的: IntPtr x = WinApi.LoadLibraryEx(@”D:\Software\Reflector\Reflector.exe”,IntPtr.Zero,2); Debug.WriteLine(x.ToInt32()); 但是,当我尝试枚举图标资源(由ID = 3定义)时: Debug.WriteLine(WinApi.EnumResourceNames(x, 3, new EnumResNameProc(ListCallback), IntPtr.Zero)); Debug.WriteLine(Marshal.GetLastWin32Error()); 我收到此错误代码(由GetLastError返回): -532462766 这通常意味着存在未知错误,据我所知,但我只是好奇 – 从可执行文件列出资源可能会出现什么问题?

将HBITMAP句柄从非托管代码传递到托管代码的安全性,以便创建System.Drawing.Bitmap

我是托管/非托管互操作的新手,所以我希望得到一些意见,了解以下过程如何安全地从非托管C ++到托管C#获取位图。 基本思路是: C#调用一个互操作函数FetchImage ,它位于非托管C ++中。 它通过一个out int param。 FetchImage有一个相应的long * param。 在C ++中, FetchImage创建一个安全的CBitmap ,即不是本地的,在其上绘制内容,使用HandleToLong()将位图的HBITMAP句柄转换为long ,将其存储在C#的参数中,然后返回。 回到C#, out int param转换为IntPtr并使用System.Drawing.Image.FromHbitmap复制数据并生成System.Drawing.Bitmap对象。 然后C#调用另一个互操作函数ReleaseImage 。 在C ++中, ReleaseImage释放与之前创建的CBitmap相关联的资源。 这是不耐烦的要点。 下面是更具体的代码示例。 函数的C ++互操作定义: namespace { std::unique_ptr bitty; } HRESULT __stdcall Helper::FetchImage( /*[out]*/ long * hBitmap ) { bitty.reset( new CBitmap ); // call CreateBitmap and then draw something, […]

使用StructureToPtr将C#结构编组到C ++

我有C#类: namespace Models { [StructLayout(LayoutKind.Explicit, Size = 120, CharSet = CharSet.Unicode)] public struct DynamicState { [FieldOffset(0)] public double[] Position; [FieldOffset(24)] public double[] Velocity; [FieldOffset(48)] public double[] Acceleration; [FieldOffset(72)] public double[] Attitude; [FieldOffset(96)] public double[] AngularVelocity; } } 和C ++ / CLI方法: Models::DynamicState SomeClassClr::DoSomething(Models::DynamicState ds) { int struct_size = Marshal::SizeOf(ds); System::IntPtr ptr = Marshal::AllocHGlobal(struct_size); DynamicStateStruct ds_struct; […]

使用c#从doc文件中检索表数据

我正在开发一个项目,涉及从.doc或.docx文件中获取数据。 输入要求采用表格格式。 是否可以以行方式或数据集的forms从表中检索数据。我正在使用Microsoft.Office.Interop.Word从doc文件中获取数据。

需要从interop dll中查找COM DLL

我在ac#项目中有一个Interop dll,但是我无法找到与之关联的相应COM dll。 请让我知道,如何从其interop dll中找出实际的COM dll。

从.NET 4.0(VS2010)项目中,如何在.NET 1.1中定位API?

我使用.NET 4.0中的3d-party库在C#.NET 4.0中开发了程序,现在我被要求定位仅在.NET 1.1中具有API的3d-party程序 我忽略了以前的一些讨论,告诉我这是不可能的: 适用于Visual Studio 2010的 MSDN .NET Framework多目标包 那么我仍然可以在VisualStudio 2010中定位.NET Framework 1.1吗? 等等 这很奇怪,我无法从.NET(4.0)中使用以前的.NET。 文章: 在Visual Studio 2008和Team Server中使用.NET 1.1 讲述: “这里是如何使用最新的IDE来使用.NET 1.1应用程序。” 它适用于VS2010(和VS2012)吗? 从.NET 4.0(VS2010)项目中针对.NET 1.1中的API有哪些可能性? 进程间通信? 更新: @HighCore, 这是一个程序(终端),提供对西方交易证券交易所的访问,需要登录和加密密钥才能通过互联网获取数据并提交订单(买入,卖出等)。 我的程序是在.NET 4.0中对机器人进行协商,但终端本质上也总是从Windows / GUI手动使用 我无法直接访问证券交易所或干预提供它的程序和库:)或者更确切地说:( UPDATE2: 我甚至没有在我的Windows XP SP3机器上找到.NET 1.1。 Windows更新似乎没有得到它。 我还记得上次我安装.NET 1.1时,我不得不重新安装VS2005,VS2008,带有Service Pack的VS2010和所有依赖项…. 也就是说,我觉得有必要在以后的版本之前安装.NET 1.1吗?

C Struct的编组作为C#委托的返回值

我试图通过绑定到本机函数的委托的值返回一个小的(8字节)结构,但是在面向.NET Framework 2.0时遇到以下错误(代码似乎在定位4.0+时正常工作) : testclient.exe中发生了未处理的“System.AccessViolationException”类型exception 附加信息:尝试读取或写入受保护的内存。 这通常表明其他内存已损坏。 我怀疑我搞砸了托管类型注释,这样返回值没有被正确编组,但我看不出我做错了什么。 下面是一个小型本机测试DLL和托管客户端的代码,可以重现该问题。 C / C ++ Win32(x86)测试DLL //Natural alignment, blittable, sizeof(StatusBlock) == 8 struct StatusBlock{ std::uint32_t statusA; std::uint32_t statusB; }; /* * When compiled this function stores the 64bit return value in the * eax:edx register pair as expected. */ static StatusBlock __cdecl SomeFunction(std::uint32_t const someVal){ return StatusBlock{ […]