1
投票
1答案
126 次观看

ATL / COM:我可以在同一对象的两个不同接口中具有相同功能吗?

我有一个用VC ++ 6.0编写的基于ATL / COM的DLL。直到最近,我的COM接口和类之间还是一一对应的。例如,假设有一个ICar接口;然后还有一个实现它的CCar类,除了CCar实现ICar之外没有其他类,并且CCar除了ICar之外没有实现任何接口。同样,IPlane和CPlane。定义可能类似于: ICar具有功能“ StepOnGas”和“ MaxPassengers”; IPlane具有“ LowerLandingGear”和“ MaxPassengers”功能。 最近,我对其进行了更改,以便有一个IVehicle接口,该接口没有相应的CVehicle类,并且由C...

2
投票
2答案
1138 次观看

从进程C ++ COM到C#中获取字节数组

从COM服务器获取C#内存的最佳方法是什么? 我们一直在使用IStream(使用CreateStreamOnHGlobal)并将其传递回去,这是可行的。但是,当我们在使用x32 C ++ COM的x64 CLR上尝试此操作时,它会崩溃。 COM必须为x32,因为它使用外部32位DLL。C#可能被迫运行32位,但挑战是使该C#运行为x64。

0
投票
1答案
820 次观看

END_COM_MAP中IUnknown成员函数的作用是什么?

ATL END_COM_MAP宏的定义如下: #define END_COM_MAP() \ __if_exists(_GetAttrEntries) {{NULL, (DWORD_PTR)_GetAttrEntries, _ChainAttr }, }\ {NULL, 0, 0}}; return _entries;} \ virtual ULONG STDMETHODCALLTYPE AddRef( void) throw() = 0; \ virtual ULONG STDMETHODCALLTYPE Release( void) throw(...

0
投票
1答案
596 次观看

为什么BEGIN_COM_MAP包含DEBUG_QI_ENTRY?

在ATL中,有一个BEGIN_COM_MAP宏用于声明一个表,该表控制在相应类对象上调用QueryInterface()时的行为。 里面有下面一行: static const _ATL_INTMAP_ENTRY _entries[] = { DEBUG_QI_ENTRY(x) 这意味着第一个表条目将是DEBUG_QI_ENTRY,其扩展如下: #ifdef _ATL_DEBUG #define DEBUG_QI_ENTRY(x) \ {NULL, \ (DWORD_PTR)_T(#x), \ (ATL::_ATL_C...

0
投票
1答案
503 次观看

WebBrowser控件从ATL到C#

在ATL中,如果我使用IWebBrowser2创建webbrowser控件,则在Windows Mobile中效果很好。我能够访问所有站点,进度条来了,一切都很好。 剩余的UI内容我在ATL中无法完成,因为这很耗时。我想去C#。 谁能建议我如何制作ATL activex控件并在c#中使用它。 谢谢

1
投票
1答案
388 次观看

无法在Win7上设置COM +构造函数字符串-CryptProtectData更改了吗?

更新 我正在尝试以编程方式为COM +组件的ConstructorString设置一个值,以供以后初始化。 有问题的代码在WinXP,Win2k3,Vista和Win2k8上可以正常工作。 我在Win7-Home Premium版本上失败。 我通过反复试验确定,构造函数字符串似乎有大小限制-如果字符串小于或等于512个字符(wchar),则会保存。更长了,对CatalogCollection对象的SaveChanges调用失败,并显示0x80110437-COMADMIN_E_PROPERTYSAVEFAILED错误。 结果是,所有系统都有该限制-512个字符。 在使用密...

10
投票
6答案
14358 次观看

如何在Release()上处置NET COM互操作对象

我有一个用托管代码(C ++ / CLI)编写的COM对象。我正在标准C ++中使用该对象。 释放COM对象时,如何强制立即调用我的COM对象的析构函数?如果不可能,请调用我的Release对象,然后在COM对象上调用MyDispose()方法? 我声明对象的代码(C ++ / CLI): [Guid(“ 57ED5388-blahblah”)] [InterfaceType(ComInterfaceType :: InterfaceIsIDispatch)] [ComVisible(true)] 公共接口类IFoo { Do...

1
投票
1答案
628 次观看

VB6 ActiveX DLL在终端服务器2008上运行缓慢

我有一个VB6 ActiveX DLL,可以在我们所有的机器上正常运行几年。 最近,我们的IT经理设置了几个位置,以便他们远程进入Terminal Server 2008,并运行用于访问我在Terminal Server上的DLL的程序,以便它们的数据库位于公司网络的本地。我的DLL在终端服务器上运行非常慢。在本地服务器上运行大约需要5秒钟,而在终端服务器上运行则需要30秒钟。 我的DLL函数之一是将消息记录在XML日志文件中。当DLL记录其第一条消息时,它将通过创建日志记录DLL来初始化日志,然后,如果日志对象不是空的,它将记录该消息。当日志DLL写入消息时,它带有时间戳,每次调...

1
投票
3答案
8063 次观看

通过经典ASP实例化.NET / COM互操作类时出错

在尝试实例化在经典ASP应用程序中公开给COM的C#.NET类时遇到问题。我已经使用tlbexp生成了一个类型库,并在组件服务中注册了它。现在,当尝试这样创建对象时: Server.CreateObject("The.Class.Name") 我遇到了错误: 服务器对象错误'ASP 0177:80131534' Server.CreateObject失败 我在网上搜索了有关此错误的信息,发现了很多讨论,但没有解决方案。错误代码0x80131534显然意味着“ COR_E_TYPEINITIALIZATION,类型未能初始化”,这表明问题出在构造函数中。有问题的类...

0
投票
1答案
381 次观看

导入类型库时添加奇怪的名称空间

我想向COM接口添加一个接受IStream*的方法。这是idl摘录: import "oaidl.idl"; import "ocidl.idl"; import "objidl.idl";//IStream is declared in this .idl file [ uuid(uuidhere), version(1.0) ] library MyLibrary { importlib("stdole32.tlb"); importlib("stdole2.tlb"); [ object, uuid("interfac...

8
投票
2答案
3670 次观看

COM如何选择如何封送接口?

据我所知,有三种方法可以在COM中实现编组: typelib编组 代理/存根编组 通过对象实现IMarshal 现在组件消费者(用户)如何选择要使用的组件?它是自己决定并使用首选方式还是调用一些内置函数来解决问题? 我目前遇到以下情况:我的组件实现了自定义接口ICustomInterface,该接口也由另一家公司的组件实现。我的组件没有类型库,也没有实现IMarshal。系统注册表包含HKCR \ Interface {uuidof(ICustomInterface)} \ ProxyStubClsid32项,以及代理/存根的GUID,该IDD可以追溯到其他公司提供的库。 ...

0
投票
1答案
108 次观看

如何获取显示的网页源

如何在c#或Win32中使网页源显示在Web浏览器控件上。即使ATL COM也可以。 我的意思是..我不想创建新的“ HTTPReqest”或“ openURL”来获取源代码。.我只想从控件中获取源代码。 如果可以的话...请让我知道。 谢谢你

0
投票
1答案
202 次观看

双工WCF + COM对象的静态集合

我正在尝试构建WCF服务,以公开我没有原始来源的特定COM对象的功能。我正在使用双工绑定,因此每个客户端都有自己的实例,因为每个事件都关联有通过回调(IAgent)传递的事件。似乎存在死锁或其他原因,因为在执行第一个操作后,我的服务在第二个操作的锁处锁定。我尝试实现这些自定义STA属性和操作行为( http://devlicio.us/blogs/scott_seely/archive/2009/07/17/calling-an-sta-com-object-from-a-wcf- operation.aspx ),但我的OperationContext.Current始终为null。任...

7
投票
2答案
4263 次观看

.NET / COM如何与通过Regasm注册的多个版本一起使用?

我有一个.NET DLL(碰巧是用C ++ / CLI编写的)。我想通过COM公开它的一部分。我这样做并使用“ regasm my.dll / codebase”对其进行注册。到现在为止还挺好。但是随后我更改了一些内容,程序集的版本号也更改了,再将dll移到了另一个文件夹。我再次注册它,然后在OLE / COM Viewer中查看我的COM对象。我看到这样的东西 InprocServer32 [代码库] = file:// c://foo/bar/my.dll 7.0.0.0 [Class] = My.Blah.Class 7.0.0.0 [程序集] =同步,版本= 7.0.0.0,...

2
投票
4答案
9541 次观看

使用COM Msxml2.XSLTemplate执行XSL转换时,如何在XML声明中设置编码语句?

我在WinBatch中编写了一个简单的软件包安装程序,需要使用有关软件包内容的信息来更新XML文件。我的第一个步骤涉及使用Msxml2.DOMDocument加载文件,根据需要添加节点和数据,然后将数据保存回磁盘。此方法运行良好,但不会在新数据中创建制表符和CR / LF空格。我想出的解决方案是编写XSL样式表,该样式表将重新创建添加了空格的XML文件。我这样做的方式是: 将XSL文件加载到Msxml2.FreeThreadedDOMDocument对象中 将该对象设置为Msxml2.XSLTemplate对象的样式表属性 通过Msxml2.XSLTemplate.createPro...

0
投票
1答案
626 次观看

如何在VC ++ ATL COM服务器中实现编组?

在实现自己的IFilter时,我发现某些消费者很可能需要从中进行编组。那就是他们来自我对象的QueryInterface()IMarshal接口。 不能使用MIDL的代理/存根-MIDL不会编译filter.idl文件-后者使用自定义结构,而MIDL不知道如何处理它们。因此,看来我需要自己实施编组。 在哪里可以找到有关实施封送处理的指南和示例?

2
投票
4答案
913 次观看

为什么Windows Search会在我的IFilter中查询一堆怪异的界面?

我已经将IFilter实现为本地VC ++ ATL进程内COM服务器。Windows Search不会使用它-它创建了我的IFilter的实例,然后执行了一堆QueryInterface()调用,具体是: IMarshal IStdMarshalInfo 接口编号为{4C1E39E1-E3E3-4296-AA86-EC938D896E92}的东西 和其他几个。由于我的IFilter仅实现IFilter,IPersist和IPersistFile,因此大多数调用都返回E_NOINTERFACE,因此Windows Search只会释放我的对象,而不会执行任何操作。 为什么...

1
投票
2答案
489 次观看

Windows 2008 Server上的PHP COM失败

我在Windows Server 2003中成功使用PHP中的COM来成功操作MS Word 2003,但在Windows 2008 Server中却破坏了相同的代码。我已将用户更改为管理员,但仍然发生相同的错误。 对于以下代码: <?php // starting word $word = new COM("word.application") or die("Unable to instantiate Word"); echo "Loaded Word, version {$word->Version}\n"; //bring it to front $word-...

0
投票
7答案
805 次观看

有谁知道在哪里可以找到标准的Windows文件对话框工具栏图标?

我正尝试推出自己的IShellBrowser实现,因为我需要一个比Windows允许的XP(最好与W2000兼容)功能更全的“文件打开和另存为”对话框* 这时,我需要添加在对话框右上角看到的标准工具栏(XP和更早版本的清单样式)-后退按钮,父文件夹按钮,新文件夹按钮和“工具” ”。 但是到目前为止,我一直没有找到这些图标/图像。我查看了USER32.dll,comdlg32.dll,comctl32.dll,但没有找到完全匹配的内容。 我可以简单地在应用程序的屏幕快照中找到它们-但是了解它们的来源可能会更有用,因此我可以访问这些按钮的各种版本(高分辨率,低分辨率,浅色) ,深色等...

2
投票
2答案
1260 次观看

C#-从SetWindowText获取事件

我们正在为现有VB6应用程序编写插件(通过COM互操作),并且我们需要一些它们不支持的功能。如果我们能够以某种方式接收到特定控件的窗口上的文本发生更改的事件,则我们可以轻松获得所需的功能。 我们已经可以使用FindWindow抓住控件的现有窗口句柄,并使用GetWindowText获取文本。 更改窗口上的文本时,是否有任何非托管/拼音方法来接收事件? 我们不想使用while循环进行轮询-我们将来可能希望在其多个控件上进行此操作。 PS-我知道有多种方法可以截获p / invoke调用(谷歌EasyHook),但是我们不想截取对SetWindowText的所有调用。我们只想将其接...

5
投票
5答案
421 次观看

COM基本链接

人们可以为我提供用于学习基本COM的教程链接或.pdf吗? 我在Google上做过搜索。.我仍然推荐stackoverflow的答案,所以请通过我。 谢谢

0
投票
1答案
204 次观看

我应该选择哪种方法在单独的进程(COM +或DCOM)中托管进程内服务器?

我需要从32位本机C ++ ATL进程内COM组件中屏蔽64位COM组件使用者。 好像COM +和DCOM都可以在一个单独的进程中托管我的进程内组件并进行编组,这样我和使用者应用程序都不必理会它,甚至不必更改我的in-proc组件。我尝试了两种方法-分别在最初使用锤子分别设置COM +应用程序或DCOM应用程序后,两者似乎都“正常工作”。 我需要一个在部署和对客户进行诊断方面最好的解决方案。我该选择哪个-COM +或DCOM?

3
投票
2答案
836 次观看

我选择哪个VC ++运行时版本-静态还是动态?

我正在开发一个64位的proc内VC ++ ATL COM服务器,该服务器基本上只是将所有调用重定向到一个proc内COM服务器。所以我的COM服务器基本上什么也不做。 最初,它在DLL(/MD编译器开关)中使用了C ++运行时。我注意到,当我将其部署在干净的64位Win2k3 regsvr32上时,失败并显示错误: LoadLibrary({fileName})失败–此应用程序无法启动,因为应用程序配置不正确。重新安装该应用程序可能会解决此问题。 Google帮助-问题是未安装VC ++ 9运行时。即使msvcr90.dll与我的COM服务器位于同一目录中,问题仍然存在。我猜这...

3
投票
3答案
3038 次观看

如何准确配置DCOM以将DLL加载到单独的进程中?

我正在尝试将现有的本机C ++ ATL进程内COM服务器强制为单独的进程。我希望DCOM可以为我做到这一点而无需更改COM服务器。 我从通常的注册表设置开始-我有一个HKCR \ CLSID {classId}条目和一个InProcServer32键,用于指定.dll文件的路径。 我生成了一个应用程序ID(GUID)并将其添加到此。具体来说,我在HKCR \ CLSID {classId}下添加了一个等于应用程序ID的字符串值“ AppId”。我还添加了HKCR \ AppId {applicationId}键和等于空字符串的字符串值“ DllSurrogate”。我认为这足以迫使我...

0
投票
1答案
1773 次观看

这个奇怪的32位/ 64位互操作解决方案如何工作?

我目前正在维护我们几年前外包的一款软件,但该软件的文档记录很少。这是一个供第三方应用程序使用的COM服务器和一个完成所有必要部署的安装程序。 有被编译为32位DLL的内核,可以在32位应用程序中使用。还有一个编译为64位DLL的填充程序,旨在供64位应用程序使用。填充程序调用CoCreateInstance()来实例化内核,并将调用重定向到内核。核心取决于大量其他32位库。 32位内核的注册方式与通常的进程内服务器完全相同-HKCR \ CLSID下有一个条目,其中包括内核类ID和InprocServer32下库的路径。 64位填充程序以相同的方式注册,并且为64位填充程序引入了一...

0
投票
1答案
281 次观看

ColdFusion COM错误

我正在从CF4.5升级到CF8。调用以前在4.5版中工作的COM dll,现在会引发“无法将复杂对象类型转换为简单值..”错误。COM对象具有一些定义为输出参数的数组。这些变量在Coldfusion中被定义为数组。关于CF中发生了什么变化导致此问题的任何想法,我该如何解决? 编辑: 这是CF代码: Arg2 = ArrayNew(1); answer = ComObject.Test(1,"Arg2"); <------This line throws the error VB ActiveX DLL代码: Public Function AddNumb...

2
投票
1答案
974 次观看

通过64位应用程序使用32位In-proc COM服务器的简单方法是什么?

我有一个32位本机C ++ ATL进程内COM服务器,它依赖于大量旧版32位库。我需要在可能发生最小更改的64位应用程序中使用它。 一个选择是将其放入COM +应用程序。还有哪些简单的选择?

2
投票
1答案
694 次观看

C#COM互操作库

我目前正在将旧版VBA应用程序移植到.Net应用程序。在此过程中,现有VBA应用程序的用户需要添加一些功能。因此,与其用VBA编码,然后再用C#编码,不如使用C#编写新功能,我想通过COM将其公开给现有的VBA应用程序,并将其保留在当前的.Net应用程序版本中。 该解决方案包含多个项目,一个用于UI的项目,一个用于业务逻辑的项目,一个用于数据访问层的项目。 这些新功能只是修改数据的一些新形式。因此,理想情况下,他们将在访问中单击一个表单命令按钮,通过COM互操作访问这些C#表单。 我应该如何通过COM Interop公开此表单。 我希望做的只是添加另一个项目MyProject.C...

7
投票
1答案
507 次观看

C#是否有可能在调用具有可选参数的VB6方法时遇到问题?

我向VB6 DLL中找到的方法添加了3个可选的布尔参数。容纳它的类是MultiUse(公共),而方法本身是Private。该类从TLB实现一个特定的接口,允许对此方法进行公共调用。 在VB6端添加了3个可选参数之后,我修改了相关的C#代码,以便它指定了3个可选参数。它构建良好...但是,当我尝试运行该代码时,它失败并显示以下错误消息: 找不到方法:'布尔值 MyTLBName.IMyClassName.MyMethod(System.Object, System.String,布尔值,布尔值, Int32,Int32 ByRef,System.Object, S...

5
投票
2答案
4080 次观看

dispinterface声明有什么用?

在Delphi中创建类型库并创建接口和关联的CoClass时,Delphi还会创建匹配的dispinterface声明。 我的理解是,这些与我的接口派生自IDispatch的事实有关,但是我认为TAutoObject实现了IDispatch所需的一切。所以我的问题是三方面的: dispinterface用来做什么? 为什么需要它? 如何使用它?