标签: com

_bstr_t到UTF-8可能吗?

我有一个_bstr_t包含日文文本的字符串.我想将此字符串转换为UTF-8字符串,该字符串定义为a char *.

我可以将_bstr_t字符串转换为char *(UTF-8)字符串而不会丢失日文字符吗?

c++ com atl bstr visual-c++

9
推荐指数
1
解决办法
4442
查看次数

C#清理C++分配的内存吗?

我有一个带有以下签名的假设COM对象

void MemAlloc(ref double[] test, int membercount)
Run Code Online (Sandbox Code Playgroud)

使用new/malloc在C++中分配内存的地方.一旦这是在C#中,使用RCW,我如何确保正确释放内存?我认为.NET很难释放,考虑到在C++中你需要知道它是否已经分配了new/malloc/mm_malloc才能正确释放它.那么,清理我的C++分配数组的合适方法是什么?谢谢.

c# c++ com interop

9
推荐指数
2
解决办法
5728
查看次数

为什么我不能使用__declspec(dllexport)从COM DLL导出DllGetClassObject()?

我正在开发一个COM DLL并尝试使用__declspec(dllexport)导出DllGetClassObject()方法.

这里是我的报关表:

extern "C" HRESULT __declspec(dllexport) __stdcall DllGetClassObject(REFCLSID rclsid, 
                                                             REFIID riid, void** ppv)
Run Code Online (Sandbox Code Playgroud)

但我一直得到这个错误:

error C2375: 'DllGetClassObject' : redefinition; different linkage
Run Code Online (Sandbox Code Playgroud)

所以我尝试检查所有DllGetClassObject定义的出现.于是在ObjBase.h中找到了以下一个.

STDAPI  DllGetClassObject(__in REFCLSID rclsid, __in REFIID riid, __deref_out LPVOID FAR* ppv);
Run Code Online (Sandbox Code Playgroud)

事实证明,STDAPI是这样的:

#define STDAPI                  EXTERN_C HRESULT STDAPICALLTYPE
Run Code Online (Sandbox Code Playgroud)

换句话说,它是这样的:

#define STDAPI                  extern "C" HRESULT __stdcall
Run Code Online (Sandbox Code Playgroud)

根据MSDN:

要导出函数,如果指定了关键字,__ declspec(dllexport)关键字必须出现在calling-convention关键字的左侧.

但我之前提到的声明没有奏效.

那么COM DLL 必须def文件导出他们的方法吗?


更新1

我用不同的方法名称测试了我的声明,如下所示:

extern "C" HRESULT __declspec(dllexport) __stdcall f()
{
    return S_OK;
}
Run Code Online (Sandbox Code Playgroud)

并且此方法已成功导出.所以这些说明符可以一起使用.似乎Visual C++编译器将STDAPIextern"C"HRESULT …

c++ com name-decoration

9
推荐指数
1
解决办法
8511
查看次数

带有无缝撤消的Excel加载项:可能吗?

我正在考虑使用COM(而不是 VBA)实现Excel加载项,它将操作工作表中的数据.

我将需要这个加载项与Undo堆栈无缝集成.进一步来说:

  1. 此加载项对数据所做的任何更改都需要用户撤消(通过标准的撤消操作)
  2. 需要保留在加载项操作发生之前撤消堆栈上的项目

到目前为止,在我的(尽管是敷衍的)研究中,目前还不清楚Excel是否可以允许这样做.如果没有,这是一个showstopper,加载项将没有任何价值.

我的问题:这可能吗?这更像是一个"是或否"的问题,而不是一个"如何"的问题,因为我需要知道我是否正在开始疯狂的追逐.但是,关于如何做到的任何指示都将是一个奖励.

delphi com excel add-in undo

9
推荐指数
1
解决办法
961
查看次数

COM无法启动作为AnyCPU编译的进程外.Net服务器

我试图让COM启动我的进程外.NET COM服务器.如果使用x64编译服务器进程,它可以工作,但是如果我使用AnyCPU(这是我想要的),那么它会挂起一段时间并最终因0x80080005(CO_E_SERVER_EXEC_FAILURE)而失败.我怎样才能让它发挥作用?

  • 我在64位计算机上运行:带有Visual Studio 2008 SP1的Windows 7.
  • 我可以在任务管理器中看到它确实启动了我的服务器.所以我猜问题是COM和服务器之间的通信(类注册).
  • 我的测试客户端应用程序是用C#编写的,但无论是为x86还是x64编译都无关紧要.使用32位C++编写的东西也会出现问题.
  • 如果我使用x64重建服务器并运行它,然后重建为AnyCPU,那么COM可以启动它.重启会让我回到原来的状态.也许COM事先不知道将要使用什么位,并且之前的执行有所帮助.
  • 我找到了Andy McMullen的博客文章,并尝试将CLSCTX_ACTIVATE_64_BIT_SERVER传递给CoCreateInstance(),但之前触发了失败:0x80040154(REGDB_E_CLASSNOTREG).我在COM注册中做错了吗?你可以在下面看到它非常简单.当以64位运行时发生注册,并且当客户端是64位时发生问题,因此不应涉及Wow6432Node.

另一个人有类似的问题,但MSFT的答案令人困惑.他似乎建议它只能通过DCOM(见链接)或COM +工作.我怀疑要么是要做很多工作,要么比分发我的.exe构建为x64和x86要糟糕得多.

你可能想知道我为什么要实现IPersistFile.这是因为我的真正问题是让BindMoniker()从32位C++程序运行到我的AnyCPU .Net程序.我把问题简化为这里提出的更简单的例子.

这是客户端代码:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    [DllImport("ole32.dll", ExactSpelling = true, PreserveSig = false)]
    [return: MarshalAs(UnmanagedType.Interface)]
    static extern object CoCreateInstance(
       [In, MarshalAs(UnmanagedType.LPStruct)] Guid rclsid,
       [MarshalAs(UnmanagedType.IUnknown)] object pUnkOuter,
       CLSCTX dwClsContext,
       [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid);

    [Flags]
    enum CLSCTX : uint
    {
        CLSCTX_LOCAL_SERVER = 0x4,
        CLSCTX_ACTIVATE_64_BIT_SERVER = 0x80000,
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        IPersistFile …
Run Code Online (Sandbox Code Playgroud)

.net c# windows com

9
推荐指数
1
解决办法
2434
查看次数

从C#访问JavaScript数组元素(通过WebBrowser)?

在窗体上使用WebBrowser并使用window.external从Javascript调用C#.传入函数中的Javascript数组类:

var x = [];
x.push(classa);
x.push(classa);

window.external.CSharpFunction(x);
Run Code Online (Sandbox Code Playgroud)

我可以在C#中成功获取x.length:

int length=(int)x.GetType().InvokeMember("length", BindingFlags.GetProperty, null, x, null);
Run Code Online (Sandbox Code Playgroud)

我的问题是如何获得x [0]和x [1]?我试过了

x.GetType().InvokeMember(string.Empty, BindingFlags.GetProperty, null, x, new object[1]{1});
Run Code Online (Sandbox Code Playgroud)

x.GetType().InvokeMember(string.Empty, BindingFlags.InvokeMethod | BindingFlags.Default, null, x, new object[1]{0});
Run Code Online (Sandbox Code Playgroud)

这两个都触发了WebBrowser控件中的错误.

谢谢

javascript c# browser com

9
推荐指数
1
解决办法
4734
查看次数

不同的DCOM/COM安全设置意味着什么?

我们的应用程序广泛使用COM和DCOM,因此我们需要确保正确设置COM安全权限.我知道我可以在组件服务MMC管理单元下访问这些权限,我也可以设置下的属性页计算机的默认值/极限

在DCOM Config节点下,我可以向下钻取并为各个应用程序设置安全权限

Logger应用程序属性页面的屏幕截图

我也理解"默认值"(除非根据每个应用程序明确设置权限,DCOM应用程序将使用的内容),"限制"(即使每个应用程序设置超出这些设置也将强制执行哪些权限)之间的关系,但是我我不能理解(并且找不到任何文档)我可以设置的不同设置之间的区别

  • 什么是"访问","启动","激活"和"配置"权限之间的区别?
  • 这些设置是影响COM应用程序还是仅影响DCOM应用程序?
  • 如果使用远程DCOM,我是否需要在服务器和客户端,或只是客户端上设置权限?
  • 有没有解释上述内容的文件?

com permissions dcom opc opc-da

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

无法转换为类型库 - 错误:找不到元素

阅读:我正在回答我自己的问题,因为它将来会帮助其他人.

我收到错误:

程序集"C:\ XYZ.dll"无法转换为类型库.处理"XYZ"时,类型库导出器遇到错误.错误:找不到元素.

以下是导致问题的代码:

[Guid("7a4e9867-96a7-43f0-9492-0327b9053853"),
ClassInterface(ClassInterfaceType.None)]
public class TimeSeriesPoint
{
    public string Date { get; set; }
    public float Value { get; set; }
}

[Guid("7a4e9867-96a7-43f0-9492-0327b9053853"),
InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IDataHelper
{
    //RCOMServerLib.IStatConnector Connector { set; }
    string Text { set; }
    void DoCallback();
Run Code Online (Sandbox Code Playgroud)

.net c# vb.net com

9
推荐指数
1
解决办法
7850
查看次数

托管的无Reg COM服务器将无法激活

我开始使用一个非常复杂的客户端和服务器系统,带有COM引用和其他东西,我一直在减少,直到我意识到我甚至无法获得Microsoft示例代码来管理受管COM服务器的免注册COM激活用C#编写.

服务器代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices.ComTypes;
using System.Runtime.InteropServices;
using System.ComponentModel;

namespace ClassLibrary1
{
   [Guid("A7AC6D8C-FF17-4D2C-A3B1-2C8690A8EA04")
   ,ComVisible(true)]
   public interface IClass1
   {
      [DispId(1)]
      string DummyFunction(string inputValue);
   }

   [Guid("81723475-B5E3-4FA0-A3FE-6DE66CEE211C"),
   ClassInterface(ClassInterfaceType.None),
   ComDefaultInterface(typeof(IClass1)),
   ComVisible(true)]
   public class Class1 : IClass1
   {
      public string DummyFunction(string inputValue)
      {
         return inputValue.Substring(0, 1) + " Inserted " + inputValue.Substring(1);
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

客户端VB6代码:

Dim c As ClassLibrary1.Class1
Set c = New Class1
MsgBox c.DummyFunction("Ben")
Run Code Online (Sandbox Code Playgroud)

客户端C++代码:

#include "stdafx.h"

#import <ClassLibrary1.tlb> raw_interfaces_only

using namespace ClassLibrary1;

int _tmain(int …
Run Code Online (Sandbox Code Playgroud)

c# c++ vb6 com regfreecom

9
推荐指数
1
解决办法
1791
查看次数

如何读取 winmd(WinRT 元数据文件)?

WinMD 是一个二进制数据文件,其中包含您需要了解的有关本地 WinRT dll 中可用的命名空间、类型、类、方法和参数的所有信息。

Windows 运行时设计

Windows 运行时使用 API 元数据(.winmd 文件)公开。这与 .NET 框架 (Ecma-335) 使用的格式相同。底层二进制合同使您可以轻松地直接使用您选择的开发语言访问 Windows 运行时 API。

每个 .winmd 文件公开一个或多个命名空间。这些命名空间按它们提供的功能分组。命名空间包含类、结构和枚举等类型。

伟大的; 我如何访问它?

Winmd 是 COM

引擎盖下的 WinRT 仍然是 COM。WinRT 中的 Winmd(Windows 元数据)是来自 COM 的旧 TLB(类型库)文件的现代版本。

| COM                        | WinRT                          |
|----------------------------|--------------------------------|
| CoInitialize               | RoInitialize                   |
| CoCreateInstance(ProgID)¹  | RoActivateInstance(ClassName)  |
| *.tlb                      | *.winmd                        |
| compiled from idl          | compiled from idl              |
| HKCR\Classes\[ProgID]      | HKLM\Software\Microsoft\WindowsRuntime\ActivatableClassId\[ClassName] |
| Code stored in …
Run Code Online (Sandbox Code Playgroud)

com midl windows-runtime winmd

9
推荐指数
1
解决办法
2786
查看次数