Tag: interop

在.NET中找到进程树

我正在寻找一种简单的方法来查找流程树(如Process Explorer之类的工具所示),使用C#或其他.NET语言。 找到另一个进程的命令行参数(System.Diagnostics.Process上的StartInfo对于当前进程以外的进程似乎无效)也很有用。 我认为这些事情只能通过调用win32 api来完成,但我很高兴被certificate是错误的。

将图像从word文档转换为位图对象

根据项目要求,我们需要将图像从word文档转换为位图对象。 为此,我们尝试将inlineshape对象从Microsoft.Office.Interop.Word dll转换为位图。 但无法获得成功,将剪贴板对象设为null。 请找到我们尝试的代码如下; using System.Drawing; using Microsoft.Office.Interop.Word; namespace WordApp1 { class Program { static void Main(string[] args) { Application wordApp = (Application)System.Runtime.InteropServices.Marshal.GetActiveObject(“Word.Application”); Documents documents = wordApp.Documents; Document d = null; foreach (Document document in documents) { if (document.ActiveWindow.Caption.Contains(“{Word document name}”)) { d = document; } } foreach (InlineShape shape in d.InlineShapes) { shape.Range.Select(); […]

VB6中的.NET对象不使用regasm.exe?

我正在为学校建立软件的软件公司,所以我们的客户端机器通常被锁定,这使我们很难在其上安装任何东西。 我们的旧系统主要基于(非常大的)MS Access项目,因此只需从本地文件夹运行即可解决访问问题。 我已经被赋予了将一些系统重新开发到c#.NET的任务 – 但是在过渡阶段能够让访问项目解开.NET事件会很好。 我今天玩了几个小时的com interops但是afaik使这些工作的唯一方法是用RegAsm.exe注册它们 – 不幸的是,这不是客户端环境中的一个选项。 我尝试过GetObject / CreateObject,但在引用dll或tlb文件时都不起作用,还有其他方法可以实现吗? 理想的解决方案是将com interop dll放在与Access项目相同的目录中。 是的,在有人说之前,我知道MS Access是邪恶的,只适合非常小的项目 – 但我只是在4个月前来到这里… 马龙

如何编组指向结构指针数组的指针?

我有一个带有以下签名的C函数: int my_function(int n, struct player **players) players是一个指向struct player对象指针数组的指针。 n是数组中指针的数量。 该函数不修改数组也不修改结构的内容,并且在返回后不保留任何指针。 我尝试了以下方法: [DllImport(“mylibary.dll”)] static extern int my_function(int n, [In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] player_in []players); 但是,它将数据编组为指向结构数组的指针,而不是指向结构指针数组的指针。

访问等效于C#List 的VBA

我有一个用C#编写的COM可见对象,它接受一个字符串数组列表。 我可以将Access 2000中的字符串数组集合发送到此对象吗? 如果没有,那么从Access 2000向C#对象发送多个字符串数组的最佳方法是什么?

从DLL调用函数?

我是C#的新手,我正在努力学习使用DLL。 我正在尝试将我的对象包装在DLL中,然后在我的程序中使用它。 public class Foo // its in the DLL { public int ID; public void Bar() { SomeMethodInMyProgram(); } } 所以我尝试将其打包到DLL但我不能,因为编译器不知道SomeMethodInMyProgram()是什么。 我想用它像: class Program // my program, using DLL { static void Main(string[] args) { Foo test = new Foo(); test.Bar(); } }

C#编组来自C ++ DLL的double *?

我有一个带有导出函数的C ++ DLL: extern “C” __declspec(dllexport) double* fft(double* dataReal, double* dataImag) { […] } 该函数计算两个双数组(实数和虚数)的FFT,返回单个双数组,实数为虚数组件交错:{Re,Im,Re,Im,…} 我不知道如何在C#中调用此函数。 我在做的是: [DllImport(“fft.dll”)] static extern double[] fft(double[] dataReal, double[] dataImag); 当我像这样测试它: double[] foo = fft(new double[] { 1, 2, 3, 4 }, new double[] { 0, 0, 0, 0 }); 我收到MarshalDirectiveExceptionexception: 无法封送“返回值”:无效的托管/非托管类型组合。 我假设这是因为C ++ double*与C# double[]不完全相同,但我不确定如何修复它。 有任何想法吗? 编辑:我已经更改了签名,以便我现在传递一些额外的信息: extern “C” […]

如何在不使用Interop的情况下将VBA代码注入Excel .xlsm?

我的目标是将宏添加到Excel工作簿,而无需在Excel信任中心中启用“信任访问VBA项目对象模块”。 (启用访问似乎存在安全风险)。 在我最初的事实查找搜索中找到了随机拼图: – 我看到VBA脚本作为vbaProject.bin存储在压缩的.xlsm文件中。 – 有几个免费/商业资源可以使用excel文件: 创建excel没有interop和模板,有或没有行和列 如果只是在C#项目中有一个VBA脚本文件,C#代码从中提取并注入Excel文档而没有VBA互操作,那将是很好的。 任何快速/快速/简单/直接的方式,或者我应该使用上面链接的免费/商业资源吗?

使用c#写入现有Excel文件

我试图打开(或创建一个新的xls)Excel文件并为其写一些值。 虽然,如果我只是创建一个新的xls文件,下面的程序工作得很好,我遇到了一些问题 **mWorkBook = oXL.Workbooks.Open (path, 0, false, 5, “”, “”, false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, “”, true, false, 0, true, false, false);** 这是错误:无法访问“LOG.xls”。 该文件可能已损坏,位于未响应的服务器上或只读。 它不是只读的,它没有被破坏(因为有时文件是在运行时创建的)。 那有什么问题呢? private static Microsoft.Office.Interop.Excel.Workbook mWorkBook; private static Microsoft.Office.Interop.Excel.Sheets mWorkSheets; private static Microsoft.Office.Interop.Excel.Worksheet mWSheet1; private static Microsoft.Office.Interop.Excel.Application oXL; private void btnSignIn_Click ( object sender, EventArgs e ) { string path = “D:\\LOG.xls”; if(!File.Exists(path)) […]

在没有类型库的情况下使用C#中的COM dll

我需要使用很久以前在Delphi中开发的COM组件(dll)。 问题是:dll不包含类型库……并且.NET中的每个互操作function(例如,TlbImp)似乎都依赖于TLB。 这个组件已经在Delphi程序中使用了很多年没有问题,因为“使用Delphi的COM对象并不是什么问题,因为我们知道接口”(引用Delphi开发人员)。 有没有办法在没有TLB的情况下从c#中使用这个DLL? 我尝试使用DLL作为非托管,但它导出的唯一方法是DllUnregisterServer , DllRegisterServer , DllCanUnloadNow和DllGetClassObject 。 我知道我将要使用的类和函数的名称,如果这可以有任何帮助。 更新:我已经尝试过实施Jeff的建议,但是我收到了这个错误: “无法将’ComTest.ResSrvDll’类型的COM对象强制转换为接口类型’ComTest.IResSrvDll’。此操作失败,因为对于具有IID'{75400500-939F-11D4-9E44-0050040CE72C}的接口的COM组件上的QueryInterface调用’由于以下错误而失败:不支持此类接口(来自HRESULT的exception:0x80004002(E_NOINTERFACE))。“ 这就是我所做的: 我从Delphi中的一个人那里得到了这个接口定义: unit ResSrvDllIf; interface type IResSrvDll = interface [‘{75400500-939F-11D4-9E44-0050040CE72C}’] procedure clearAll; function ResObjOpen(const aClientID: WideString; const aClientSubID: WideString; const aResFileName: WideString; aResShared: Integer): Integer; {safecall;} … end; implementation end. 从这个我做了这个界面 using System.Runtime.InteropServices; namespace ComTest { [ComImport] [Guid(“75400500-939F-11D4-9E44-0050040CE72C”)] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IResSrvDll […]