检索CLSID为{XXXX}的组件的COM类工厂失败,原因是以下错误:80040154
我使用C#.NET开发了Windows服务来生成PDF报告.要生成PDF文件,我正在使用第三方DLL.该应用程序正在我的Windows XP平台中运行.当我在 Windows Server 2008 64位版本中> 检索Com class Factory的 具有CLSID的组件 {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6} 由于以下错误而失败: 80040154. 我使用regsvr32命令注册了DLL.我可以在注册表中看到此CLSID.但是问题仍然存在. 有什么问题? 解决方案 在VS-项目属性中 - 在"构建"选项卡中 - 平台目标= x86 其他解决方案 我遇到了一个非常相似的问题. 我需要在64位机器上开发的Web应用程序中使用旧的32位DLL.我使用该文件夹中的Regsvr32版本将32位DLL注册到Windows \ Syswow64文件夹中. 呼叫第三方DLL从Visual Studio中的单元测
0 2023-12-08
编程技术问答社区
托管时ASP.Net Com-InterOp的Excel生成问题
在我的ASP.NET应用程序中,我使用MSEXCEL对象Libby(com-Interop)生成了Excel文件.该应用程序在VS Dev中工作正常.环境. 但是,当我在服务器中托管它时,我会遇到以下错误,如果我没有通过远程桌面连接登录到服务器的用户. "通过CLSID检索组件{00024500-0000-0000-0000-C000-0000000046}由于以下错误而失败:8000401a无法启动服务器进程,因为配置的身份不正确.检查用户名和用户名和用户名.密码.(Hresult的例外:0x8000401a)." 我也设置了DCOM配置.奇怪的是,至少一个用户应通过RDC连接到服务器.如果是这样,每个人都可以产生Excexels.如果没有上述错误.应用程序的其余功能正常. 服务器是Windows Server 2008,IIS7.以及通过VPN连接应用程序的用户. 有没有人经历过这样的问题? 预先感谢. 解决方案 感谢 @rofans.ne
0 2023-12-08
编程技术问答社区
在Compact Framework(Windows CE)上从ASP调用C# DLL
我正在Windows CE上编写一个ASP应用程序,该应用程序需要调用.NET DLL(C#)中存在的业务逻辑. 看起来好像紧凑型框架允许我们从托管代码调用本机代码,但CF不允许我们从本机代码调用托管代码. - 但是,我不是100%确定的. 是否有人成功使用COM Interop从CF上的ASP拨打托管DLL的方法?如果是这样,您能指出我可以学习如何做的地方吗? 如果没有,鉴于我必须使用ASP(在CF上),并且我坚持在托管汇编中使用业务逻辑,我还能将数据从汇编中取出ASP应用程序? 解决方案 我刚刚被约翰·斯皮思(John Spaith)(Wince Team成员)通知了博客文章 - ...紧凑的框架没有 允许您从 本地人,所以你不能拥有你的 ISAPI/ASP页面调用托管. (您可以执行托管代码 - >本机 呼叫,但不是相反.) 这是Spaith帖子的链接
0 2023-12-07
编程技术问答社区
如何为第三方定义的COM接口注册一个代理/存根?
还有另一家公司运送了消耗ianothercompanyinterface的产品.我们想运送一个实现IanotherCompanyInterface的COM对象.该界面不兼容自动化,因此启用编组的下一个最简单选项是使用代理/存根.另一家公司不运送代理/存根,也不想. 编译和注册代理/存根本身不是问题,而是考虑以下情况.我们的公司运送了一个实施Ianothercompanyinterface和第三个制品的COM对象.因此,这两个组件最终都可能被部署在同一台计算机上. 代理/存根注册是接口的全系统.他们的代理/存根实现应该如何共同使用? 解决方案 您可以通过使用无重程com或激活上下文完全跳过客户端中的注册表.您可以在清单文件中提供"自定义" cominterfaceexternalproxystub条目,该文件引用您的代理/stub实现. 其他解决方案 自从我使用这些东西以来已经有一段时间了,所以这是"大声思考",但希望这会有所帮助... 我假定您可以看到一
0 2023-12-06
编程技术问答社区
我究竟如何配置DCOM以将我的DLL加载到一个单独的进程中?
我正在尝试将现有的本机C ++ ATL内部com服务器迫使单独的过程.我希望DCOM可以在不更改COM服务器的情况下为我做到这一点. 我从通常的注册表设置开始 - 我有一个hkcr \ clsid {classid}条目和一个inprocserver32键在其中指定了.dll文件的路径. 我生成了一个应用程序ID(GUID),并在此处添加.具体来说,我在HKCR \ clSID {classID}下等于应用程序ID下添加了一个字符串值" appid".我还添加了HKCR \ appid {applicationId}键和一个等于空字符串的字符串值" dllsurogate".我认为这足以将我的COM服务器施加到默认的系统提供的替代. DCOM应用程序出现在DCOM配置控制台中.但是,当我调用CoCreateInstance()或CoGetClassObject()并提供类ID和CLSCTX_LOCAL_SERVER时,它返回"未注册".我在做什么错? upd:解决
0 2023-12-06
编程技术问答社区
实现托管财产处理程序外壳扩展的正确方法是什么?
现在,.NET CLR 4.0并排支持(SXS)操作,现在应该可以写下shell 托管代码的扩展.我尝试了此事,并成功地编码了财产处理程序 这实现了Ipropertystore,IinitializewithStream和Ipropertystorecapabilities. 处理程序 正常工作,在通过资源管理器浏览文件时如预期的那样被调用.它在显示 预览面板中的自定义属性和文件属性"详细信息"面板. 但是,当我尝试 在预览面板中编辑属性,然后单击"保存",我会收到一个"使用中的文件"错误,说明 该文件在Windows Explorer中打开. 几个花絮: 当Explorer调用iInitializewithStream.initialize stgm属性设置为stgm_share_deny_write. ,Explorer都没有致电Ipropertystore.setValue或ipropertystore.commit. 我在相同文件属性的不同线程上看到对
0 2023-12-06
编程技术问答社区
COM+库应用程序的目的是什么?
创建COM+应用程序时,向导提供了在库和服务器应用程序之间进行选择的提议. 在单独的过程中激活了服务器应用程序,这可以用于廉价地互动64位消费者使用32位com组件. 在呼叫者进程中激活的库应用程序有什么用?为什么要使用它们代替普通的旧com服务器? 解决方案 有几个: 性能 - 您不必通过消息自动化(编组和Unmarshalling) 来更快一些 隔离 - 如果许多不同的应用程序正在使用库,则每个应用程序都有自己的副本.当处理MTA(多线公寓)和STA(单线公寓模型) 之间的差异时,这一点是最重要的. 所有不同的呼叫者共享了程序内服务器(实际上是一个失控的服务器)(这是拥有便宜IPC/RPC的好方法) 好吧,我正在编辑更多定义,还有更多参考: 上下文实际上是使用对象的所有状态. 因果关系实际上是一个概念,表明在上下文中使用对象. ("因果关系是com方法调用的分布式链,在任何数量的过程中跨越任何数量的上下文" - 从ISBN:
0 2023-12-06
编程技术问答社区
CoInitialize()/CoUninitialize()调用配对
我有一个使用COM对象的单线程应用程序.一开始,我实际上会致电当应用程序停止时,它调用了两次CoUninitialize(),但在这些调用之间试图调用某些com对象的方法 - 这些调用只是违反访问的崩溃,因为我认为com对象是最终确定的,并在第一个调用中释放到CoUnitialize().如果我删除对CoInitialize()/CoUnitialize()的重复调用,则有效. 但是为什么? MSDN说我可以反复拨打CoInitialize(),只能将这些呼叫与匹配的CoUnitialize()调用配对. 为什么在第一个呼叫CoUninitialize()的com对象最终确定CoUninitialize(). 解决方案 听起来好像您正在正确执行此操作,但是,请检查您的counitialialize呼叫是在该应用程序关闭后以及该窗口的消息循环完成后完成的.
0 2023-12-05
编程技术问答社区
在IDL中把一个IUnknown派生的接口标记为双重性有什么意义?
查看我们的代码,我在一个.idl文件之一中找到了一个好奇的定义: [ object, uuid(uuidhere), dual, nonextensible, oleautomation, hidden ] interface IOurInterface : IUnknown { //methods here }; 如何直接从IUnknown派生的接口可能是双接口?如果我删除dual属性,会破裂吗? 解决方案 在/a>关于宣教的另一个问题用户Voyce 指向本文基本上陈述了以下内容: 在标记dual或oleautomation(或两者)时,任何接口(IDISPATCH衍生)被标记时,当调用RegisterTypeLib()时,它会特别处理(通常由DllRegisterServer完成).对于每个接口,创建了HKCR \ Interface {InterfaceID}键,其中{00020424-0000-000
0 2023-12-05
编程技术问答社区
为什么我使用 "Both "COM线程模型而不是 "Free"?
根据本文如果我将我的com对象注册为" com对象",则" com"对象或"免费"线程模型必须完全是线程安全.具体来说,必须同步对全局共享变量的所有访问,并且对成员变量的所有访问也必须同步.这是很多努力. 现在,我知道能够使用"免费"线程模型注册我的对象是有利的,并且可能值得付出使其完全安全的价格.但是,为什么我要使用"两个"线程模型进行所有相同的操作并注册我的对象呢?有什么优势?我如何在"免费"和"免费"之间选择? 解决方案 两个线程模型 将组件标记为支持线程模型"两者"的主要原因是从单个螺纹公寓(STA)调用组件时的性能改进. 如果将组件标记为MTA,并且您的组件是由STA内部创建的,则您的组件将在单独的MTA公寓中创建,而"由此导致的公寓间编制可能会足够降低性能,以消除所有工作中的所有工作,从而使有效的,自由的读取组件" ".但是,如果将组件的线程模型标记为"两个",则将在STA对象的公寓内创建并直接访问. 因此,如果您认为您的组件可能会在sta中调
0 2023-12-05
编程技术问答社区
即使找到了接口,CoCreateInstance仍然返回E_NOINTERFACE
我在一个应用程序中都有一个com类CMyCOMServer在一个应用程序中实现IMyInterface,均为正确的GUID. CMyCOMServer::QueryInterface如果请求iunknown或iMyinterface,将返回S_OK(并将其施放到正确的类型),否则返回E_NOInterface. 在同一PC上的另一个应用程序中,我致电: HRESULT hr = ::CoCreateInstance(__uuidof(CMyCOMServer), 0, CLSCTX_SERVER, __uuidof(IMyInterface ),(void **)&pInterface); 它返回e_nointerface.因此,我以为我做错了什么,并在CMyCOMServer::QueryInterface上添加了一个断点.我发现,当调用CoCreateInstance时,QueryInterface被触发了多次的不同接口: 首先,请求iunknown-没问题
0 2023-12-05
编程技术问答社区
当在BHO(浏览器助手对象)中使用时,SetWinEventHook会破解IE。
我有一个c#bho设置钩子,以便我可以在IE焦点时跟踪: public class BHO : IObjectWithSite, IOleCommandTarget { delegate void WinEventDelegate(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime); const uint WINEVENT_OUTOFCONTEXT = 0; const uint EVENT_SYSTEM_FOREGROUND = 3; [DllImport("user32.dll")] static extern bool UnhookWinEvent(IntPtr hWinEventHook); [DllImport(
0 2023-12-04
编程技术问答社区
从进程中获取当前打开的Word文档
目标是在Microsoft Word的实例中获取通往文档的完整途径,该过程我有一个过程参考. 伪代码示例: Process myWordProcess = something; // This is my process reference DocumentInformation docInfo = SomeNamespace.GetDocumentInformation(myWordProcess); string documentPath = docInfo.FullName; // "C:\User\Foo\Documents\Test.docx" 起点是Process对象,由WINWORD.exe执行. 我不是在寻找包括解析process.MainWindowTitle的方法,而是一个,而是一个,可以说,"正确"解决方案. 进行了相当多的初步研究,我相信需要的是Windows可访问性API. 这是我从pinvoke尝试的: internal
0 2023-12-04
编程技术问答社区
什么原因导致错误HRESULT: 0x80010105 (RPC_E_SERVERFAULT)?
我创建了一个使用第三方支付处理引擎来授权信用卡交易的ASP.NET Web服务. Web服务托管在单独的应用程序服务器上,并通过ActiveX对象(.ocx扩展名)连接到付款处理服务器.最近,当我尝试使用" IsAvaiable"检查. 有人建议一个好地方开始研究这个问题吗? (我知道与供应商联系是第一个选择,但是在我们联系技术支持之前,我想连续将我的"鸭子"联系起来) 解决方案 我使用Web服务中的ActiveX对象遇到了相同的错误(RPC_E_SERVERFAULT).每当ActiveX对象崩溃时,IIS都会丢弃此错误,这将掩盖对象崩溃的原因(对我们来说,它通常在加载无效的文件时崩溃并从中处理并从中返回值). 您是否检查了系统日志等.查看您的ActiveX控件是否已记录了实际错误? 如果您看不到任何明显的东西,我建议您与他们的技术支持联系,以找出诊断实际错误以及是否在任何地方记录其错误的最佳方法. 其他解决方案 迈克尔,您的第三方Active
0 2023-12-02
编程技术问答社区
我应该将Interop.x.dll文件与.NET应用程序一起部署吗?
我们有一个.NET应用程序,该应用程序在我们应用程序的VB6部分中使用了不同的DLL中的Com-Objects.引用com库时,Visual Studio 2012创建了一个Interop.x.dll和引用.我应该从构建计算机中分发Interop.x.dll还是使用一些.NET命令行工具将其再生?什么工具?部署引用com的.NET应用程序的最佳实践是什么? 解决方案 否,这是不需要的,因为VS2010和.NET 4.0.您只需将Interop Assembly引用的Embed Interop Types属性设置为true即可.默认设置. 实际上,将Interop类型复制到您自己的组件中,就好像您亲自编写了[ComImport]声明一样.而且只有您在代码中实际使用的元素.该功能为大型功能付出了最大的收益,尤其是Microsoft.office.interop组件非常大.但是当然,对于小组件,始终也很方便,因为您不必再​​部署Interop组件了.
0 2023-11-30
编程技术问答社区
如何在VB6(或VBA)引用对话框中添加一个COM暴露的.NET项目?
我已经创建了一个.net组件,该组件是根据杰出的文章构建和部署.NET com组装 phil Wilson. ,从适当的com注册了.NET组件的意义上,一切正常,并且编译的COM代码可以在没有任何麻烦的情况下调用它. 唯一奇怪的是,使用VB 6.0或VBA时针对Com Proped .NET组件开发,要求程序员"浏览"到相关.TLB文件的确切文件位置,之后一切正常.也就是说,类库未直接在"参考"对话框中显示,因此您必须浏览到文件位置. 再次,COM Interop方面确实有效100%;但是,我认为必须有一些设置可以使库在VB 6.0和VBA的参考对话框中直接可见. 有人知道这个设置是什么吗?还是只要通过注册就可以自动发生这种情况? 事先感谢您的任何建议... Mike 编辑/更新 要回答JPOH关于我是否使用/Codebase Switch的问题,我正在使用.msi设置软件包,而不是明确使用regasm.组件正在正确注册,这可以通过以下事
0 2023-11-30
编程技术问答社区
使用window.external向C# WebBrowser控件传递javascript日期对象
我可以使用JavaScript window.external从WebBrowser winforms Control和Pass string,int,int,bool等调用WebBrowser.ObjectForScripting的C#方法.但是,我不知道如何通过JavaScript Date对象和以某种方式将/元帅转换为.net DateTime class. 显然,我可以通过string来解析它,但这实际上不是重点.我只是好奇我该如何使用javascript Date和.net DateTime? 解决方案 我终于使它起作用了.我不知道为什么,但是我无法使用dynamic使用它.这是解决方案: [ComVisible(true)] public class Foo { public void Bar(object o) { var dateTime = (DateTime)o.GetType().InvokeMember("get
0 2023-11-29
编程技术问答社区
将c#的匿名类对象暴露给COM(JavaScript)。
.NET 4.5+中是否有类/API允许将C#匿名类的实例视为com的后期对象?例如.我想这样做: webBrowser.Document.InvokeScript("TestMethod", new object[] { new { helloProperty = "Hello!", byeProperty = "Bye!" } }); 并在JavaScript中使用它: function TestMethod(obj) { alert(obj.helloProperty + ", " + obj.byeProperty); } 创建一个助手类以包裹匿名对象并通过 解决方案 我已经煮了一个助手课以实现这一目标,基于此出色的博客文章. 用法: webBrowser.Document.InvokeScript("TestMethod", new object[] { new Ref
0 2023-11-29
编程技术问答社区
WebBrowserSite:如何在派生类中调用一个私有的COM接口方法?
这是挑战.我是从框架的 WebBrowserSite 类.通过 WebBrowser.CreateWebBrowserSiteBase ,我覆盖了我的派生版本 WebBrowser 类 - 专门用于提供自定义站点对象.该框架的WebBrowser实现进一步将其传递给基础的未掌握的WebBrowser ActiveX控件. 到目前为止,我在实施中设法覆盖IDocHostUIHandler(例如 this ).我现在正在寻找更多的核心com接口,例如IOleClientSite,我想将其传递到WebBrowserSite.所有这些都以ComImport的态度暴露于com,但通过框架的实现WebBrowserSite/UnsafeNativeMethods将其声明为internal或internal.因此,我不能明确重新进化他们在派生类中.我必须定义自己的版本,就像IDocHostUIHandler一样. 因此,问题是,我如何称呼WebBrowserSite中定义的私人或内部com
0 2023-11-29
编程技术问答社区
是否可以在不添加注册表项的情况下为COM互操作注册一个.NET程序集?
我正在通过单击一次部署.NET VSTO应用程序.作为安装过程的一部分,需要为COM Interop注册该应用程序的主组件.我知道这可以通过编写代码来执行" regasm assembly.dll/tlb"来完成,但是问题在于,将安装我的应用程序的目标工作站没有管理权,因此在尝试注册时,Remasm失败了类型库. 我的问题是,当我没有管理访问时,我如何注册我的.NET组件以进行com互操作性? 解决方案 您可以使用COM组件的无注册激活.我已经在通过Click-Once部署的应用程序中使用了此功能,并且效果很好.这里有一些链接可以让您入门: 基于.NET的组件的注册 - 基于.NET的激活 P> 演练:手动部署clickonce应用程序 如何:comconce部署无管理的应用程序在托管汇编中使用COM组件 P> 其他解决方案 我在研究相关问题时遇到了无注册的com.我最终没有使用它,所以我无法确定它是否可以解决您的问题,但是值得一试: 简化使用cli
0 2023-11-25
编程技术问答社区