草庐IT

c++ - 如何通过 COM 公开通过结构化异常处理捕获的异常?

我用VisualC++实现的COM服务器使用了大量其他C++代码。其他C++代码有时会将代码包装在__try-__except中,并将结构化异常转换为自定义C++异常。这部分我无法更改。我的COM服务器的任何方法都不应该让这些异常通过COM边界传播,因此它必须捕获它们并将它们转换为HRESULT。这些自定义C++异常包含在翻译过程中获得的原始错误代码-它类似于EXCEPTION_ACCESS_VIOLATION。问题是我如何设计一个合适的HRESULT值,以便客户端在看到一个访问冲突)。假设它是在WinBase.h中定义的EXCEPTION_ACCESS_VIOLATION#defin

c++ - 通过COM将自定义接口(interface)类型的SAFEARRAY返回给VB6

是否可以从C++COM函数(VC6)向VB6客户端返回一组已定义的接口(interface)对象?我已经在网上搜索过,但没有找到任何描述我需要做什么的内容。我已经看到很多传递BSTR和VARIANT类型,但我需要一些方法让客户端实际使用我在数组中返回的接口(interface)类型。我认为我需要做的事情-使用安全阵列-使用具有VT_UNKNOWN类型的SAFEARRAY,这反过来意味着我需要将对象作为IUnknown对象放入数组中。从这里开始我就难住了。是否可以在VB6中解释IUnknown类型,并以某种方式将其转换为我需要的类型?还是我以完全错误的方式解决这个问题......澄清:放

c++ - 如何为 COM 接口(interface)中的方法生成弃用警告 (c++)

在我工作的地方,我们使用的是“类COM”模型,因为我们通常遵循COM规则,但不执行MIDL编译,也不针对c/c++以外的其他语言。因此,我知道我总是可以改变规则以满足我的需要,但我尽量不这样做,因为我们可能希望有一天能够真正兼容COM,如果那一天到来,我们希望它尽可能轻松。我想在任何人使用特定接口(interface)的特定方法编译代码时打印警告。在c++中(我们只支持微软编译器),我们会在函数声明前加上__declspec(deprecated)来达到我们的目的。我可以只将它添加到我的接口(interface)方法声明之前,还是有更好、更COM的方法来做到这一点?我还想知道是否仅在方

c++ - VS COM 项目在 32 位编译但在尝试编译 64 位时抛出错误 C2259

您好,我目前正在运行VisualStudio2010,并且有一个上下文菜单shell扩展在32位机器上完全以32位运行,因此所有方法都存在。这是一个ATL项目。32位上没有错误甚至警告。问题来了。当我进入visualstudio下的配置管理器并将事件解决方案平台从Win32切换到x64并尝试编译时,我收到错误“错误C2259:'ATL::CCOMObject:无法实例化抽象类”。既然这个完全相同的项目确实在32位编译和运行,为什么它会抛出x64的错误?任何想法或正确方向的观点将不胜感激。需要实现的主要方法如下:STDMETHODIMPInitialize(LPCITEMIDLIST,L

c# - 今天创建 COM 组件的最佳方法是什么?

我想为我的宠物项目创建一个桌面COM对象。我对COM没有任何经验,快速搜索显示ATL会简化事情。我想知道今天是否有更好的方法来创建COM组件。从某种意义上说更好的是更少的样板,使用C#而不是C++以及您可能想到的任何其他东西。 最佳答案 如果在客户端机器上部署或依赖.NETFramework安装对您来说不是问题,那么C#比C++容易得多(尽管您可能必须重新声明接口(interface)、IID等...在C#中,使用P/Invoke)。如果减少依赖性是一个问题,那么带有ATL的C++更好。

c++ - 什么时候用 "class_name obj_name = func()"替换 "class_name obj_name{func()}"有意义?

在代码中我看到了以下结构:constclass_nameobj_name{func()};func()返回名为class_name的类的对象。所以,我想知道为什么不使用以下结构:constclass_nameobj_name=func(); 最佳答案 constclass_nameobj_name{func()};作者通过写上面的代码,试图遵循统一初始化语法(C++11引入),从而避免繁琐的解析和最令人烦恼的解析,即使是经验丰富的程序员也会意外陷入其中。他正试图将最佳实践灌输到他的大脑中,这样他就不会偶尔陷入上述解析问题,如下所述。

fatal: unable to access ‘https://github.com/Mrrrrr.git/‘: Failed to connect to github.com Time out

解决fatal:unabletoaccess‘https://github.com/Mr.git/’:Failedtoconnecttogithub.comport443after21046ms:Timedout的问题问题:准备向github上push写的项目代码时,一直出现这个错误,无法push。原因:连接不到github的网站目录解决fatal:unabletoaccess'https://github.com/Mr.git/':Failedtoconnecttogithub.comport443after21046ms:Timedout的问题1.因为代理的问题,请看这里2.ping不到i

c++ - 如何在 Visual Studio 2012 中创建 HelloWorld COM Interop

首先,我是COM的新手,目前很困惑。我在MSDN和一般网络上阅读了很多关于COM的文档,但其中很多似乎已经过时且过于复杂。以下是我认为让它发挥作用所必需的。还没有,所以我确定我遗漏了一些东西,但是通过提供我的食谱,我希望有人能发现问题:创建一个C#控制台应用程序项目。我将其命名为CSharpApp创建一个C++ATL项目。我称之为ComLib.Interop。添加类(模板:ATLSimpleObject),我称之为“InteropDemo”在类View中,右键单击IInteropDemo并添加方法HelloWorld。(已删除,保留以确保答案中的编号正确。)编译。将对ComLib.In

关于 ..\OBJ\Temp.axf: Error: L6200E: Symbol Image multiply defined (by myfun.o and main.o).报错

在main.c文件写数组太臃肿,于是想写到别的头文件里面,这里显示报错…\OBJ\Temp.axf:Error:L6200E:SymbolImagemultiplydefined(bymyfun.oandmain.o).Notenoughinformationtolistimagesymbols.Notenoughinformationtolistloadaddressesintheimagemap.Finished:2information,0warningand1errormessages.“…\OBJ\Temp.axf”-1Error(s),0Warning(s).翻译为..\OBJ\T

c# - 在 .NET 中调用 COM 枚举器的正确方法是什么?

我正在调用一个外部提供的COMDLL,我已经为其生成了一个COM互操作包装器。为了便于争论,让我们调用我要调用的接口(interface)IEnumFoo。IEnumFoo具有典型的COM枚举器模式:HRESULTNext(ULONGcelt,IFoo**rgelt,ULONG*pceltFetched);其中第一个参数是期望结果的数量,第二个参数是写入结果的缓冲区,最后一个参数描述了实际写入的结果数量。当我选择“添加引用”并将VisualStudio指向此DLL时,它会生成一个具有以下签名的COM互操作程序集:voidNext(uint,outIFoo,outuint)这只允许.NE