标签: com

在COM中:我应该在CoCreateInstance之后调用AddRef吗?

CoCreateInstance是否在我正在创建的接口上自动调用AddRef,或者我应该在之后手动调用它?

c++ com

22
推荐指数
2
解决办法
5330
查看次数

如何最好地将VARIANT_BOOL转换为C++ bool?

当使用COM时,布尔值将作为VARIANT_BOOL传递,该变量在wtypes.h中声明为short.还有预定义的truefalse值:

#define VARIANT_TRUE ((VARIANT_BOOL)-1)
#define VARIANT_FALSE ((VARIANT_BOOL)0)
Run Code Online (Sandbox Code Playgroud)

哪个是从VARIANT_BOOL转换为C++ bool类型的最佳方法?明显的变体是:

  1. 与VARIANT_FALSE比较

  2. 简单地投奔布尔

其他方式可以很容易地发明.

这是最好的方法 - 最可读,最符合标准,最不容易出现种植错误,最不容易出现移植到64位平台的问题?

c++ windows com interop boolean

22
推荐指数
2
解决办法
2万
查看次数

如何在没有Application.Run的情况下从VBE加载项运行宏?

我正在为VBE编写COM加载项,其中一个核心功能是在单击命令栏按钮时执行现有的VBA代码.

代码是用户在标准(.bas)模块中编写的单元测试代码,其模块如下所示:

Option Explicit
Option Private Module

'@TestModule
Private Assert As New Rubberduck.AssertClass

'@TestMethod
Public Sub TestMethod1() 'TODO: Rename test
    On Error GoTo TestFail

    'Arrange:

    'Act:

    'Assert:
    Assert.Inconclusive

TestExit:
    Exit Sub
TestFail:
    Assert.Fail "Test raised an error: #" & Err.Number & " - " & Err.Description
End Sub
Run Code Online (Sandbox Code Playgroud)

所以我有这个代码获取主机Application对象的当前实例:

protected HostApplicationBase(string applicationName)
{
    Application = (TApplication)Marshal.GetActiveObject(applicationName + ".Application");
}
Run Code Online (Sandbox Code Playgroud)

这是ExcelApp班级:

public class ExcelApp : HostApplicationBase<Microsoft.Office.Interop.Excel.Application>
{
    public ExcelApp() : base("Excel") { }

    public override void Run(QualifiedMemberName …
Run Code Online (Sandbox Code Playgroud)

c# com reflection ms-office vbe

22
推荐指数
2
解决办法
2105
查看次数

如何将char*转换为BSTR?

如何将char*从C dll传递给VB

这是示例代码:

void Cfunc(char *buffer,int len)
{
  BSTR buf_bstr = SysAllocString((BSTR)buffer);
  VBptr.VBfunc(buf_bstr,len);
}
Run Code Online (Sandbox Code Playgroud)

此功能不起作用,实际上其他一些值被发送到VB而不是实际值.

有人可以建议一个解决方案?

c string vb6 com bstr

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

是否有人成功使用免费注册COM与.NET组件?

直到最近,我们还很高兴地使用免注册COM作为我们的原生和.NET COM组件.然而,我们遇到了一个奇怪的问题,我们的应用程序开始在Windows XP SP3上随机崩溃(但不是在Vista上),因为我们只更改了.NET程序集的版本号以从候选版本迁移到发布版本.(难道你不讨厌墨菲定律吗?)

经过多次失败的人工和磨牙之后,我们发现问题是sxs.dll中的一个已知错误,它在检索有关.NET类的信息时会导致堆损坏.有一个热修复使问题消失,但热修复不打算重新分配.

我们有点难过在免注册COM实现中存在这样一个可怕的错误.是否有人成功使用免注册COM for .NET组件?你是怎么解决这个问题的?

.net com winsxs sxs regfreecom

21
推荐指数
1
解决办法
3783
查看次数

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

将JPEG图像转换为字节数组 - COM异常

使用C#,我正在尝试从磁盘加载JPEG文件并将其转换为字节数组.到目前为止,我有这个代码:

static void Main(string[] args)
{
    System.Windows.Media.Imaging.BitmapFrame bitmapFrame;

    using (var fs = new System.IO.FileStream(@"C:\Lenna.jpg", FileMode.Open))
    {
        bitmapFrame = BitmapFrame.Create(fs);
    }

    System.Windows.Media.Imaging.BitmapEncoder encoder = 
        new System.Windows.Media.Imaging.JpegBitmapEncoder();
    encoder.Frames.Add(bitmapFrame);

    byte[] myBytes;
    using (var memoryStream = new System.IO.MemoryStream())
    {
        encoder.Save(memoryStream); // Line ARGH

        // mission accomplished if myBytes is populated
        myBytes = memoryStream.ToArray(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,执行行ARGH给了我一条消息:

COMException未处理.句柄无效.(HRESULT异常:0x80070006(E_HANDLE))

我不认为这个文件有什么特别之处Lenna.jpg- 我是从http://computervision.wikia.com/wiki/File:Lenna.jpg下载的.你能说出上面的代码有什么问题吗?

c# com wpf file-io image

21
推荐指数
3
解决办法
6万
查看次数

.NET组件和COM组件之间有什么区别

.NET组件和COM组件之间有什么区别,有时我们使用.NET组件包含在我们的项目中,有时我们包含COM引用.背后的想法是什么?提前致谢.

.net com

20
推荐指数
3
解决办法
2万
查看次数

无法转换类型异常的COM对象

我有以下代码:

public void Test(IMyInterface iInterface)
{
  iInterface.CallMethod ( );
}
Run Code Online (Sandbox Code Playgroud)

哪个工作正常.但是,如果我将代码更改为线程:

private IMyInterface myInterface;
public void Test(IMyInterface iInterface)
{
  myInterface = iInterface;
  new Thread ( new ThreadStart ( CallInterfaceMethod) ).Start ( );
}

public void CallInterfaceMethod ( )
{
  myInterface.CallMethod ( )
}
Run Code Online (Sandbox Code Playgroud)

当我使用线程时,我收到异常:

无法将"System .__ ComObject"类型的COM对象强制转换为接口类型"IMyInterface".此操作失败,因为对于具有IID"{GUID}"的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口

但是应该支持接口就好了吗?有人对这里发生的事情有任何想法吗?

c# com interface

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

在C#中使用COM互操作时的RCW和引用计数

我有一个使用Office互操作程序集的应用程序.我知道运行时管理的"运行时可调用包装器(RCW)".但我不太确定引用计数如何增加.MSDN说,

RCW只保留对包装的COM对象的一个​​引用,而不管调用它的受管客户端的数量.

如果我理解正确,在以下示例中,

using Microsoft.Office.Interop.Word;

static void Foo(Application wrd)
{
    /* .... */
}

static void Main(string[] args)
{
    var wrd = new Application();
    Foo(wrd);
    /* .... */
}
Run Code Online (Sandbox Code Playgroud)

我将实例传递wrd给另一个方法.但这不会增加内部引用计数.所以我想知道引用计数增加的场景是什么?任何人都可以指出引用计数增加的情况吗?

另外我读了一些博客,说在使用COM对象编程时避免使用双点.像,wrd.ActiveDocument.ActiveWindow.作者声称编译器创建单独的变量来保存将增加引用计数器的值.恕我直言,这是错误的,第一个例子证明了这一点.那是对的吗?

任何帮助都会很棒!

c# com ms-office rcw office-pia

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

标签 统计

com ×10

c# ×5

.net ×2

c++ ×2

ms-office ×2

boolean ×1

bstr ×1

c ×1

file-io ×1

image ×1

interface ×1

interop ×1

marshalling ×1

office-pia ×1

rcw ×1

reflection ×1

regfreecom ×1

string ×1

sxs ×1

vb6 ×1

vbe ×1

windows ×1

winsxs ×1

wpf ×1