Tag: interop

如何绕过Marshal.Copy(32位)长度限制?

我正在尝试在托管(C#)和非托管(C ++ Win32)代码之间来回移动数据。 我可以使用Marshal.Copy ,它可以正常运行,直到数据集大于2GB,因为Marshal.Copy有一个带符号的32位int(2GB)长度限制。 知道怎么解决这个问题吗? 目前我在托管端使用AllocHGlobal(IntPtr) .ToPointer() ,在非托管端使用AllocHGlobal(IntPtr) 。 如果我不能使用Marshal.Copy来回移动大数据(> 2GB)我可以使用什么?

将Excel图表从Excel导入到PowerPoint会导致某些计算机上出现“RPC_E_SERVERFAULT”

这是一个令人恼火的。 我创建了一种方法将工作簿中的所有Excel图表复制到PowerPoint幻灯片。 public int ImportExcelChartsFromWorkbookToSlides(int startingSlideIndex, string workbookPath, string[] slideTitles, int chartPosTop, int chartPosLeft = 10, int titleWidth = 680, int titleHeight = 20, int titlePosTop = 90, int titlePosLeft = 20, int titleFontSize = 18) { int slideIndex = startingSlideIndex; int titleIndex = 0; EXCL.Application objExclApp = new EXCL.Application(); EXCL.Workbook objWorkbook = objExclApp.Workbooks.Open(workbookPath, Editable: […]

在C#中创建GUI并在VBScript中调用

我尝试用C#制作一个带有COM-visible的ActiveX。 它是一个Windows窗体。 我成功地将其构建为dll ActiveX,然后我编写了一个VBScript代码来调用它。 从那之后出现但消失了。 我不知道为什么@@这是我的代码: C#代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using Microsoft.Win32; using System.Reflection; namespace ActiveXTestLibrary { [ProgId(“ActiveXTestLibrary.UserControl”)] [ClassInterface(ClassInterfaceType.AutoDispatch)] [ComVisible(true)] public partial class UserControl1 : Form { public UserControl1() { InitializeComponent(); } [ComVisible(true)] public void Hello() { this.Show(); } private void radButton1_Click(object […]

当用作Win32回调时,是否需要固定C#方法?

我正在将一个C#实例方法传递给Win32 API调用,该调用稍后将用作从Windows到我的应用程序的回调函数。 当我传递对象的引用时,该引用被临时固定,直到调用返回(参见Jason Clark的这篇文章 )。 如果API调用将在调用返回后保留地址供以后使用,我必须在调用之前显式地固定对象(我可以通过Marshal.AllocHGlobal从非托管内存中分配它,或者我可以通过GCHandle固定托管对象) 。 Alloc )。 但是,保留用作Win32 API回调的方法呢? 具体来说,我有这个代码: protected const int CALLBACK_FUNCTION = 0x30000; private delegate void MidiInProc( int handle, uint msg, int instance, int param1, int param2); [DllImport(“winmm.dll”)] private static extern int midiInOpen( out int handle, int deviceID, MidiInProc proc, int instance, int flags); private void MidiInProcess( int hMidiIn, uint […]

来自Process.MainWindowHandle的C#HwndSource

我试图“挂钩”窗口的消息以检测最小化/最大化。 我环顾四周,并认为这样做的唯一/最佳解决方案是挂钩窗口的消息,并检查WM_WINDOWPOSCHANGED消息,然后检查它的状态。 我遇到了一个问题。 System.Windows.Interop.HwndSource source = System.Windows.Interop.HwndSource.FromHwnd(System.Diagnostics.Process.GetProcessesByName(“notepad”)[0].MainWindowHandle); System.Windows.Interop.HwndSourceHook hook = new System.Windows.Interop.HwndSourceHook(WndProc); source.AddHook(hook); 它会给我一个“对象引用未设置为对象的实例”。 “source.AddHook …”上的错误。 在断点时,也清楚源变量为空。 换句话说:它无法在第一行获得HwndSource。 我知道可以使用“WindowInteropHelper”,但是当你将实际窗口作为Windows.Window可用时,但在我的情况下,我没有。 非常感谢任何解决方法/解决方案, RenéSackers PS我在执行代码时100%确定记事本是否正在运行,它设法找到它,它是主窗口句柄。

自动更正文本C#Word

我正在尝试使用word来自动纠正一些不是英文的文本问题是当我使用拼写检查function弹出“拼写和语法”对话框并等待用户输入时我希望文本是自动纠正。 所以我的问题是如何解决这个问题? using System.Collections.Generic; using Microsoft.Office.Interop.Word; using Word = Microsoft.Office.Interop.Word; using TobyCL.ro.toby.StringOperations; namespace namespace.ro.toby { class WordProofing:IProof { private readonly Word.Application _wordApp; private readonly Word.Document _wordDoc; private static object _oEndOfDoc = “\\endofdoc”; public WordProofing() { _wordApp = new Word.Application {Visible = false}; _wordDoc = _wordApp.Documents.Add(); } public void Close() { object obj = Word.WdSaveOptions.wdDoNotSaveChanges; _wordDoc.Close(ref […]

将interop对象的Word转换为byte 而不保存物理

我在内存中使用Microsoft.Office.Interop和Microsoft.Office.Word以及所有创建的,段落,表格等创建了一个对象。 我需要这个对象生成一个内容byte []来为表中的一个相同类型的字段提供信息。 我无法以任何方式使用oDoc.Save(“path”)以任何方式保存它以便使用FileStream并解决我的问题。 尝试了几种解决方案以及如何使用剪贴板,并没有奏效。 有解决方案吗

IntPtr补充

所以从我所知道的,我发现的IntPtr添加的每个托管示例都是错误的 。 例如: http : //www.atalasoft.com/cs/blogs/stevehawley/archive/2006/10/16/10987.aspx 我的想法是,如果IntPtr在32位系统上(或接近)int32.MaxValue,并且你添加一个溢出int32的偏移量,那么它仍然是一个有效的内存地址(因为它在uint32中是有效的,并将由IntPtr中的负数表示?)! 我相信代码应该是这样的: public static IntPtr Offset(IntPtr src, int offset) { switch (IntPtr.Size) { case 4: return new IntPtr((int)((uint)src + offset)); case 8: return new IntPtr((long)((ulong)src + offset)); default: throw new NotSupportedException(“Not supported”); } } 我疯了吗? 有没有人有一个久经考验的IntPtr加法例子?

C#/ COM互操作仅在调试器中工作

从C#应用程序到inproc COM服务器组件的COM互操作有问题。 我已将问题简化为简单的c#测试程序。 它实例化服务器组件的interop类,将字符串的值设置为实例上的属性,然后设置另一个字符串属性。 我没有做任何与编组有关的事。 只使用我添加对COM组件的引用时生成的interop类。 就像是: using MyLib; // Interop assy // … MyComp comp = new MyComp(); comp.Prop1 = “abc”; comp.Prop2 = “xyz”; 成果: 如果我在VS之外运行测试程序,那么当设置第二个属性时,我一直得到一个0x80010105 ,其HRESULT为0x80010105 ( RPC_E_SERVERFAULT )。 如果我在Visual Studio 2005中运行测试程序,那么它一直正常工作。 我在非托管C ++中编写了等效代码(没有atl,只是简单的接口指针),这在VS内外都能正常工作。 我的问题 :在调试器内部运行时可能会考虑到我所看到的内容时发生互操作的环境有何不同? 我假设interop marshaller正在生成E_RPC_SERVERFAULT ,但为什么只在调试器中? 有关如何进行此操作的任何建议? [我没有对com组件说太多,因为我的问题是我在调试器中看到的不同行为。 该组件经过了充分测试,已经投入生产使用超过7年(在服务器环境中每天进行数千次调用),因此我对此非常有信心。 它是一个32位的DLL。 我有源,但目前没有适合它的构建环境。 即使我这样做,我也不确定如何从托管代码调试它。 这可能吗?] UPDATE 还没有解决方案,但还有一些观察: 我尝试以管理员身份运行应用程序,并且还关闭了UAC。 结果相同。 我尝试在错误发生之前附加到进程但是在输出窗口中没有看到抛出结构化exception的指示。 我尝试将测试应用程序主线程的公寓模型显式设置为STA,然后设置为MTA,但这没有任何区别。 COM组件是公寓线程。 […]

如何在idl中声明一个IStream,以便visual studio将其映射到swinterop.comtypes?

我有一个COM对象需要从C#客户端获取流并处理它。 看来我应该使用IStream。 所以我写下我的idl。 然后我使用MIDL编译为tlb,编译我的解决方案,注册它,然后将我的库的引用添加到C#项目。 Visual Studio在我自己的库中创建一个IStream定义。 如何阻止它这样做,让它使用COMTypes IStream? 似乎有3个答案之一:添加一些导入 到idl所以它不会重新声明IStream(导入MSCOREE会这样做,但不能解决C#问题) 在视觉工作室中以某种方式混淆IStream – 但我不知道如何做到这一点。 我的所有想法都是完全错误的,我根本不应该使用IStream 帮助…谢谢 [ uuid(3AC11584-7F6A-493A-9C90-588560DF8769), version(1.0), ] library TestLibrary { importlib(“stdole2.tlb”); [ uuid(09FF25EC-6A21-423B-A5FD-BCB691F93C0C), version(1.0), helpstring(“Just for testing”), dual, nonextensible, oleautomation ] interface ITest: IDispatch { [id(0x00000006),helpstring(“Testing stream”)] HRESULT _stdcall LoadFromStream([in] IStream * stream, [out, retval] IMyTest ** ResultValue); }; [ uuid(CC2864E4-55BA-4057-8687-29153BE3E046), noncreatable, version(1.0) […]