标签: com-interop

如何获取Windows中可用的COM接口列表

有没有办法在带有GUID的Windows机器上获取已注册的COM接口列表?

在任何人认为这与编程无关之前,我需要这些数据以便在f#(或C#)中引用tlbimp未暴露的接口的COM接口.

c# com com-interop

4
推荐指数
1
解决办法
2043
查看次数

无法在C#中实例化COM组件 - 错误80070002

我正在尝试在我的机器上实例化Windows Media Player COM对象:

Guid mediaPlayerClassId = new Guid("47ac3c2f-7033-4d47-ae81-9c94e566c4cc");
Type mediaPlayerType = Type.GetTypeFromCLSID(mediaPlayerClassId);
Activator.CreateInstance(mediaPlayerType); // <-- this line throws
Run Code Online (Sandbox Code Playgroud)

执行最后一行时,我收到以下错误:

System.IO.FileNotFoundException was caught
  Message="Retrieving the COM class factory for component with CLSID {47AC3C2F-7033-4D47-AE81-9C94E566C4CC} failed due to the following error: 80070002."
  Source="mscorlib"
  StackTrace:
       at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)
       at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache)
       at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache)
       at System.Activator.CreateInstance(Type type, Boolean nonPublic)
       at System.Activator.CreateInstance(Type type)
       at MyStuff.PreviewFile(String filePath) in F:\Trunk\PreviewHandlerHosting\PreviewHandlerHost.cs:line …
Run Code Online (Sandbox Code Playgroud)

c# com interop com-interop

4
推荐指数
1
解决办法
1万
查看次数

如何将一个DIctionary <>暴露给COM Interop

我有一个接口,沿着这些方向定义:

Interface foo
  {
  int someProperty {get; set;}
  Dictionary<string, object> Items;
  }
Run Code Online (Sandbox Code Playgroud)

实现此接口的具体类需要为COM Interop注册.一切都编译好,程序集似乎注册正常,但是当试图创建COM对象时(例如从PowerShell)我得到一个错误.

这似乎与我正在使用的通用Dictionary <>类有关.所以这是一个问题:

  1. 甚至可以通过COM Interop公开泛型集合吗?
  2. 如果是,那怎么办?
  3. 如果不是,那么解决方法是什么?

c# generics com-interop

4
推荐指数
1
解决办法
1956
查看次数

尝试使用 C# 中的新 IFileDialog 和 IFileOpenDialog 接口以最少的代码打开文件对话框

我正在尝试使用 C#、Visual Studio 2010 中的 IFileOpenDialog 接口显示可以选择文件夹的标准打开文件对话框。

我正在尝试使用最少的代码,所以我只在接口中定义了我需要的方法:

using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// Disable warning CS0108: 'x' hides inherited member 'y'. Use the new keyword if hiding was intended.
\#pragma warning disable 0108

namespace FolderDialog
{

internal static class IIDGuid
{
    internal const string IModalWindow = "b4db1657-70d7-485e-8e3e-6fcb5a5c1802";
    internal const string IFileDialog = "42f85136-db7e-439c-85f1-e4075d135fc8";
    internal const string IFileOpenDialog = "d57c7288-d4ad-4768-be02-9d969532d960";
}

internal static class CLSIDGuid
{
    internal const string FileOpenDialog = "DC1C5A9C-E88A-4dde-A5A1-60F82A20AEF7";
}

static class NativeMethods
{

    [Flags]
    internal …
Run Code Online (Sandbox Code Playgroud)

c# interface com-interop openfiledialog

4
推荐指数
2
解决办法
9416
查看次数

如何创建SafeArray C#?

我需要创建一个SafeArray来传递给COM方法.
如何在C#中创建/维护/销毁SafeArray?

我以前从来没有遇到过SafeArrays,也没有找到快速的谷歌搜索,所以任何帮助都非常感谢.

编辑:添加示例代码:

COM方法签名

[id(0x000000d5)]
HRESULT GetTags(
                [in] SAFEARRAY(long) buffer, 
                [out, retval] long* retval);
Run Code Online (Sandbox Code Playgroud)

C#中生成的互操作方法

int GetTags(System.Array buffer)
    Member of Cwise.IUser
Run Code Online (Sandbox Code Playgroud)

所以在这种情况下,我是否必须创建一个SafeArray,或者我可以简单地将一个普通的.Net数组传递给COM方法GetTags?

c# com interop com-interop safearray

4
推荐指数
1
解决办法
9363
查看次数

C#COM Interop:在Excel工作表中写入单元格

我在winform中使用Microsoft.Office.Interop.Excel,我正在读取一个excel文件,处理数据并输出新的excel文件.但是我在写入单元格时遇到问题 - 特别是添加列标题.这是代码:

Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
Workbook wb = xlApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
Worksheet ws = (Worksheet)wb.Worksheets[1];
for (int i = 0; i < dt.Columns.Count; i++)
{
    for (int j = 0; j < dt.Rows.Count; j++)
    {
        ws.Cells[j + 1, i] = dt.Rows[j][i].ToString();
    }
}
ws.Cells[0, 0] = "Ticket Number";
ws.Cells[0, 1] = "Transit";
ws.Cells[0, 2] = "Outage Start Date";
ws.Cells[0, 3] = "Outage End Date";
ws.Cells[0, 4] = "Business Impact";
wb.Worksheets.Add(ws);
Run Code Online (Sandbox Code Playgroud)

其中"dt"是我的DataTable.嵌套的for循环不会抛出运行时错误,但后面的代码会抛出.错误只是说:COM异常未处理,来自HRESULT的异常:0x800A03EC.

任何建议表示赞赏.

问候.

c# excel com-interop winforms-interop winforms

4
推荐指数
1
解决办法
6611
查看次数

关闭Word文档时出错:"消息过滤器指示应用程序正忙."

我正在使用Microsoft Interop将Word Doc保存为HTML文件,当我尝试关闭文档时出现此错误:

消息过滤器指示应用程序正忙.(来自HRESULT的异常:0x8001010A(RPC_E_SERVERCALL_RETRYLATER))

这是我的代码:

// word interop setting
object visible = true;
object readOnly = true;
object missing = Type.Missing;
object saveChanges = true;
object htmlFile = (object)Server.MapPath(@"worddoc.html");
object fileType = 
  (object)Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatFilteredHTML;       

// open document
Microsoft.Office.Interop.Word.Application wordApp =
  new Microsoft.Office.Interop.Word.Application();
Microsoft.Office.Interop.Word.Document wordDoc =
  wordApp.Documents.Open(ref url, ref missing, ref readOnly, ref missing,
       ref missing, ref missing, ref missing, ref missing, ref missing,
       ref missing, ref  missing, ref  visible, ref missing, ref missing,
       ref missing, ref missing);

try
{                           
    // save …
Run Code Online (Sandbox Code Playgroud)

c# asp.net com-interop

4
推荐指数
1
解决办法
1万
查看次数

用于C#COM自动化的双接口和仅调度接口之间的区别

我正在针对C++ COM服务器实现ac#COM客户端.当我将COM接口标记为"Dual"时,COM客户端正常运行,但是当我删除"Dual"属性时,它会抛出InvalidCastException.

因此,对我来说简单的方法是将其标记为Dual.但是从在线阅读来看,它似乎不是推荐的COM服务器使用方法.任何人都可以向我解释将界面标记为双重以及为什么不推荐它的重要性(以外行的术语)?

我只需要它用于测试目的,我正在使用C#客户端(不要以为我会使用VB)

或者,任何人都可以指出我为非双接口创建C#COM客户端的良好演练(MSDN上的示例都是双接口)谢谢!

c# com-interop idispatch

4
推荐指数
1
解决办法
894
查看次数

主互操作程序集(PIA)是否要求在计算机中安装Microsoft Office才能工作

主互操作程序集(PIA)是否要求在计算机上安装Microsoft Office才能运行?

我经历了这么多令人困惑的帖子/网站,无法得出结论.

我有一台未安装办公室的机器,我正在使用VS2010.由于Microsoft.Office.Interop.Excel程序集在COM部分中不可用于referance.我通过思想.Net部分在referances中添加它.仍然会引发以下错误.

由于以下错误,检索具有CLSID的组件的COM类工厂失败:80040154未注册类(HRESULT异常:0x80040154(REGDB_E_CLASSNOTREG))

这是Mircosoft网站上的声明,最终用户计算机上不需要Office PIA来运行Office解决方案.这究竟是什么意思?

这是否意味着没有Office安装我们可以使用互操作程序集?

如果不是为什么我们需要PIA来安装办公室以使工作正常?

c# interop com-interop visual-studio-2010 office-interop

4
推荐指数
2
解决办法
6916
查看次数

如何从 C# 调用 COM 对象

首先,我意识到这里有很多帖子讨论了这个话题。我一定很容易地阅读了其中的 20 多篇。但他们都没有给出我寻求的答案。

我编写了一个很小的 ​​C# 测试 COM DLL,其中有一个打印“我还活着!”的方法。在一个消息框中。以管理员身份使用 VStudio,我可以构建和注册 COM 对象。我已成功从 VBA 调用对象并运行该方法。我可以在 VStudio 添加引用/COM 对话框中看到 COM 接口的名称。这一切都让我觉得这个对象是正确构造、注册和可用的。

现在我试图从控制台 C# 应用程序调用它。像许多其他人一样,我试图找出等效于 VBA“CreateObject("DLLName.ClassName")”的代码来获取 C# 中的对象。

一种方法是将 DLL 的引用添加到我的控制台应用程序项目中。我通过“添加引用”对话框的“项目”部分而不是通过对话框的 COM 部分指向程序集。然后我可以简单地说var o = new MyComImplementationClass();和对待它像任何其他类一样。这有效,但这意味着我的控制台应用程序在作弊并且没有通过通常的 COM GAC 接口使用 COM 对象。

另一种方法(这不起作用,但我希望它起作用)是通过“添加引用”对话框上的“COM”选项卡添加引用。我可以看到它,但 VS 抗议“XXX.tlb 文件是从 .NET 程序集导出的。改为添加对程序集的引用。” 这让我回到上面的解决方案,我认为这意味着我的应用程序在作弊。(例如,我不必添加对 VBA 测试应用程序的引用。)

另一种方法是使用Type.GetTypeFromProgId如下代码片段所示。但我也不能让它工作。我必须传入不正确的 ProgID 字符串 - 我感觉它与注册表信息有关,并且与我在 VBA 中提供 CreateObject() 的“DLLName.ClassName”字符串不同。

  public static dynamic ComObjectGet () {
    const string progID = "ComExampleDLLName.ComImplementationClassName";
    Type foo = Type.GetTypeFromProgID (progID);
    dynamic COMobject = Activator.CreateInstance …
Run Code Online (Sandbox Code Playgroud)

c# com com-interop

4
推荐指数
1
解决办法
2899
查看次数