我有一个函数可以关闭应用程序中除主窗体之外的所有窗体procedureCloseOpenForms(constComponent:TComponent);vari:Integer;beginfori:=0topred(Component.ComponentCount)dobeginCloseOpenForms(Component.Components[i]);ifComponent.Components[i]isTFormthenbeginTForm(Component.Components[i]).OnCloseQuery:=nil;TForm(Component.Component
我正在研究一组本质上是插件的东西,它们是COM服务器。每个插件都有一组由另一个组件管理的配置数据,配置数据的主键是插件的ProgID。当插件需要访问配置项时,它会调用并传入其ProgID和所需属性的名称。这是一个遗留设计,我必须保持向后兼容性。我现在需要加载每个插件的多个实例,每个实例都有一组不同的配置数据。我正在考虑的解决方案是为每个插件创建多个唯一的ProgID,每个ProgID将指向插件的单个ClsId。因此,插件的每个实例都将由其ProgID标识,ProgID仍用作配置数据的主键,并且一切都是100%向后兼容的。那么,问题:这是一种可以接受的技术吗?(多个ProgID都指向一个
我正在为脚本语言编写nativeCOM/Ole/ActiveX包装器。我需要一些建议来实现事件/回调(比如来自Microsoft.XMLHTTP对象的onreadystatechange)我注意到一些COM对象可以通过IDispatch接口(interface)调用我的自定义对象。这是管理事件的唯一方法吗? 最佳答案 如果您要询问有关COM事件如何工作的更一般的问题(来自任何客户端,而不仅仅是对安全性等有一些特定要求的IE)以及如何公开对象的事件,那么有一个很好的CodeProject文章,UnderstandingCOMEvent
美好的一天。什么是初始化COM接口(interface)引用计数的正确方法?我看到很多例子,其中引用计数被初始化为1,但也看到了设置为0的例子。什么是差异? 最佳答案 您必须这样设置它,以便在调用最后一个Release()时对象自行处理。这通常意味着当您创建对象时,在您处理指向请求该对象的调用者的对象指针之前,它的引用计数必须为1。您是将引用计数器初始化为零然后调用AddRef()(在将指针移交给调用方之前)还是将其初始化为1而不是调用AddRef()通常由您决定。 关于COM引用计数,
我有一个测试实用程序,它依赖于在我的开发机器上安装/注册的ocx文件。我们希望在测试机器上运行这个工具,而不用任何不必要的文件污染机器。除了目标机器软件外,什么都不应该安装。在网络驱动器上或从复制到测试机器的独立目录运行该工具是理想的。但是,在测试机上注册ocx是不可能的。将ocx文件放在与exe相同的目录中不起作用。无论如何它仍然给我这个错误——“应用程序启动失败,因为应用程序配置不正确。重新安装应用程序可能会解决问题。”我还能尝试什么?仅供引用,我使用的是VisualStudio2008。 最佳答案 如果我们谈论的是Window
我正在使用Delphi7尝试将Word文档加载到OLEContainer中。该程序在终端服务(Windows2003)环境中运行。以下代码会为某些用户生成错误:procedureTForm1.Button1Click(Sender:TObject);beginOleContainer1.CreateObjectFromFile('c:\tmp\test.doc',false);end;这是一个简单的应用程序,在表单上有一个OLEContainer和一个按钮。c:\tmp\test.doc是Word2003文档。对于某些用户,此代码会产生错误InvalidFORMATETCstructu
我正在尝试构建http://support.microsoft.com/kb/178749/EN-US/中描述的示例为了构建一个使用自动化以编程方式访问Excel的应用程序。我有VisualC++2005/VisualStudio2005。有些说明并不完全匹配(主要是类向导),但总体思路似乎是相同的。问题:在使用“新类”创建我的包装类后,我没有得到excel.h文件。所以我不能按照它在第13步中指定的那样#include该文件。我在我的windebug目录中确实得到了一个excel.tlh和一个excel.tli,但这似乎不起作用。我尝试了的所有订单#include"stdafx.h"
一段使用win32ole的ruby代码require'win32ole'ie=WIN32OLE.new('InternetExplorer.Application')ie.visible=trueie.gohome部分代码使用win32apirequire"Win32API"message="ThisisasampleWindowsmessageboxgeneratedusingWin32API"title="Win32APIfromRuby"api=Win32API.new('user32','MessageBox',['L','P','P','L'],'I')api.call(0,
我有一个nativeC++ATL进程内COM服务器。单独的测试程序调用CoInitialize(),调用CoCreateInstance(),然后在指针上调用Release(),然后调用CoUnitialize()并退出。如果我在VisualC++调试器下运行测试程序,调试CRT会报告一次内存泄漏,并且每次分配的编号都是相同的。我用了anallocationhook发现没有返回堆的对象是类工厂对象。所以基本上会发生以下情况:程序调用CoCreateInstance()COM内部调用DllGetClassObject()ATL实例化工厂并将所有权传递给调用者(COM内部)然后工厂永远不会
我有一个InternetExplorerBHO,它可以在当前网站上执行脚本,然后读取在该脚本中分配的变量。不幸的是,从IE9(我用RC测试过)开始,读取JS变量会导致HRESULT0x80020006。脚本集给JS变量赋值如下:this.=其中this是当前的Window对象。它是使用执行的hr=pWindow->execScript(ccom_js,lang,&vEmpty);并且使用JS变量读取boolget_js_var(CComPtrpDisp,LPOLESTRname,VARIANT*dest){DISPIDid;HRESULThr=pDisp->GetIDsOfNames(