我有一个_bstr_t包含日文文本的字符串.我想将此字符串转换为UTF-8字符串,该字符串定义为a char *.
我可以将_bstr_t字符串转换为char *(UTF-8)字符串而不会丢失日文字符吗?
我有一个带有以下签名的假设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++分配数组的合适方法是什么?谢谢.
我正在开发一个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关键字的左侧.
但我之前提到的声明没有奏效.
我用不同的方法名称测试了我的声明,如下所示:
extern "C" HRESULT __declspec(dllexport) __stdcall f()
{
return S_OK;
}
Run Code Online (Sandbox Code Playgroud)
并且此方法已成功导出.所以这些说明符可以一起使用.似乎Visual C++编译器将STDAPI和extern"C"HRESULT …
我正在考虑使用COM(而不是 VBA)实现Excel加载项,它将操作工作表中的数据.
我将需要这个加载项与Undo堆栈无缝集成.进一步来说:
到目前为止,在我的(尽管是敷衍的)研究中,目前还不清楚Excel是否可以允许这样做.如果没有,这是一个showstopper,加载项将没有任何价值.
我的问题:这可能吗?这更像是一个"是或否"的问题,而不是一个"如何"的问题,因为我需要知道我是否正在开始疯狂的追逐.但是,关于如何做到的任何指示都将是一个奖励.
我试图让COM启动我的进程外.NET COM服务器.如果使用x64编译服务器进程,它可以工作,但是如果我使用AnyCPU(这是我想要的),那么它会挂起一段时间并最终因0x80080005(CO_E_SERVER_EXEC_FAILURE)而失败.我怎样才能让它发挥作用?
另一个人有类似的问题,但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) 在窗体上使用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控件中的错误.
谢谢
我们的应用程序广泛使用COM和DCOM,因此我们需要确保正确设置COM安全权限.我知道我可以在组件服务MMC管理单元下访问这些权限,我也可以设置下的属性页计算机的默认值/极限

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

我也理解"默认值"(除非根据每个应用程序明确设置权限,DCOM应用程序将使用的内容),"限制"(即使每个应用程序设置超出这些设置也将强制执行哪些权限)之间的关系,但是我我不能理解(并且找不到任何文档)我可以设置的不同设置之间的区别
阅读:我正在回答我自己的问题,因为它将来会帮助其他人.
我收到错误:
程序集"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) 我开始使用一个非常复杂的客户端和服务器系统,带有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) WinMD 是一个二进制数据文件,其中包含您需要了解的有关本地 WinRT dll 中可用的命名空间、类型、类、方法和参数的所有信息。
Windows 运行时使用 API 元数据(.winmd 文件)公开。这与 .NET 框架 (Ecma-335) 使用的格式相同。底层二进制合同使您可以轻松地直接使用您选择的开发语言访问 Windows 运行时 API。
每个 .winmd 文件公开一个或多个命名空间。这些命名空间按它们提供的功能分组。命名空间包含类、结构和枚举等类型。
伟大的; 我如何访问它?
引擎盖下的 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)