标签: out-of-process

如何在没有tlb文件的情况下使用进程外COM服务器

它是关于Window COM组件的.

  • Server.exe:一个32位进程外COM服务器
  • CLSID_Application:Server.exe中COM对象的GUID
  • Client.exe:64位客户端应用程序,以无注册表的方式使用Server.exe.

我们知道,exe不能用作无注册表的COM组件,模仿这种行为,我通过提供确切的路径自己启动Server.exe进程:

  • 的CreateProcess( "SERVER.EXE")
  • IClassFactory*pFactory = CoGetClassObject(CLSID_Application)
  • pFactory->的CreateInstance(ppAppObject);

如果我注册了Server.tlb,它可以正常工作,但是在取消注册Server.tlb之后,它只是无法创建ppAppObject,即使我将清单嵌入到Server.exe和Client.exe中:

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<file name="Server.tlb">
  <typelib tlbid="{DAC4A4C9-F84C-4F05-A7DC-E152869499F5}" version="1.0" helpdir=""></typelib>
</file>
<comInterfaceExternalProxyStub name="IApplication" iid="{D74208EA-71C2-471D-8681-9760B8ECE599}" tlbid="{DAC4A4C9-F84C-4F05-A7DC-E152869499F5}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub>
</assembly>
Run Code Online (Sandbox Code Playgroud)

你对此有什么想法吗?

编辑:事实证明,如果我为接口指定tlbid并将清单嵌入到两个exe中,它确实有效

com regfreecom out-of-process

8
推荐指数
1
解决办法
1955
查看次数

COM进程外服务器启动多个实例

如何强制本地COM服务器在公共帐户下运行(本地系统会好)?RunAs文档似乎只适用于DCOM,并且不能在本地运行.

我面临的问题是我的CoCreateInstance是从在不同桌面上运行的进程调用的,而在这种情况下SCM想要为每个桌面启动一个新服务器,我只想要一个单一的实例 - 按照设计!

com out-of-process

6
推荐指数
1
解决办法
1185
查看次数

编组封送接口是否为代理或原始接口提供了编组器?

这是一个具体的例子:

我通过调用创建了一个IWeBrowser2接口wb.CoCreateInstance(CLSID_InternetExplorer, 0, CLSCTX_SERVER);.这给了我一个从我的进程到任何正在运行的iexplore.exe进程的编组接口恰好包含在我的线程A中的这个浏览器选项卡.

现在我使用IGlobalInterfaceTable获取此接口的cookie,将其传递给我的线程B并从那里请求封送接口.

问题:我是在线程A中获取代理还是直接获取IE进程中的实例?

我似乎明智的是,我会通过自己的引用获得实例的直接代理,
但是:

如果我结束我的线程A,我在那里创建的cookie变得无效,我无法检索(并关闭)我创建的Web浏览器的接口指针.这没有意义,除非该线程中有一个thunk在线程退出时被销毁.

编辑:哦,两个线程都是STA.

windows com marshalling out-of-process

5
推荐指数
1
解决办法
766
查看次数

来自同一用户帐户的LocalServer32 EXE的COM激活是否共享现有进程?

当客户端应用程序调用c_com_ptr :: CreateInstance(使用ATL包装器)时,我启动了一个COM服务器LocalServer32 EXE.

在Windows 7上,当在同一用户帐户下运行的第二个客户端应用程序也调用c_com_ptr :: CreateInstance时,将启动在同一用户帐户下运行的EXE的第二个副本.在过去的生活中,我的印象是第二个客户将分享第一个EXE.

是否共享了LocalServer32进程?什么时候或什么时候不?谷歌搜索答案给我一个巨大的噪音信号比,我找不到答案.

我的CLSID注册表项具有LocalServer32值,提供EXE路径,ProgID,可编程(空字符串),TypeLib(GUID)和VersionIndependentProgId.我有一个AppID密钥.

希望运行的EXE作为服务,我不介意的过程中不共享.我只是想知道规则,所以我知道会发生什么(在Windows Server 2003之后.)

编辑:在下面的Chris回答之后,我检查了服务器中的CoRegisterClassObject调用.我正在使用ATL,并且我覆盖MyServer :: RegisterClassObjects以挂接到CAtlExeModuleT :: RegisterClassObjects的调用链,并看到ATL正在使用CLSCTX_LOCAL_SERVER和REGCLS_MULTIPLEUSE.

将此更改为CLSCTX_LOCAL_SERVER和REGCLS_SINGLEUSE会导致启动更多进程,具体取决于客户端创建的COM对象的数量,如预期的那样.

仍然,回到REGCLS_MULTIPLEUSE,每个COM客户端进程得到一个COM服务器进程,每个服务器进程包含其客户端的所有COM对象,如预期的那样,除非两个COM客户端在同一个用户帐户下运行,它们各自得到自己的服务器,这不是我理解REGCLS_MULTIPLEUSE.

区别在于客户端本身实际上是Windows服务吗?(它们是.)当作为用户帐户运行的Windows服务进程在REGCLS_MULTIPLEUSE下创建COM对象时,这是否被区别对待,导致观察到的行为?为什么我会获得多个流程?(只是为了澄清,我希望我的COM服务器作为Windows服务运行,但使用它的客户端确实作为Windows服务运行.)

此外,将客户端作为本地系统或网络服务运行,REGCLS_MULTIPLEUSE按我的预期工作:只启动一个COM服务器EXE进程.当COM客户端是在用户帐户下运行的Windows服务时,将启动多个进程.

windows com atl out-of-process

5
推荐指数
1
解决办法
2850
查看次数

没有代理/存根DLL的进程外COM服务器?

我正在学习如何实现进程外COM服务器,并且遇到了本文

我可以构建它,并且它运行良好,但是代理/存根DLL在哪里?我所看到的只是IDL文件,在构建过程中会从该文件中生成代理/存根代码。但是DLL是如何构建的,它在哪里?

com winapi rpc out-of-process

2
推荐指数
1
解决办法
3164
查看次数

进程外的COM单例

我正在处理一个单线程库(不是线程安全的),我想将其包装在COM进程外对象中,以避免其线程不安全.我需要一种行为,其中每个新COM对象在其自己的进程中实例化 - 某种形式的进程外单例.

已经有一段时间了,因为我一直在与硬核COM打交道,所以我不知道如何处理这个问题,或者在没有一些诡计的情况下这是否可行.

c++ com atl out-of-process

1
推荐指数
1
解决办法
762
查看次数

SLAB,进程外:更改事件源方法的签名会导致错误的事件记录

我为记录事件实现了一个事件源类.在多次更改记录事件的一种方法的签名(参数名称和参数类型)后,不再正确记录事件.例如,当记录事件时,不是使用当前参数名称设置Payload,而是使用用于先前版本方法的参数记录事件.例如:

方法的版本n:

    [Event(5, Message = "Action: {0}",
    Task = Tasks.PAGE,
    Keywords = Keywords.USER_ACTION,
    Level = EventLevel.Informational)]
    public void LogAction(string action, string paramName)
    {
        this.WriteEvent(5, action, paramName);
    }
Run Code Online (Sandbox Code Playgroud)

版本n + 1的方法:

    [Event(5, Message = "Action: {0}",
    Task = Tasks.PAGE,
    Keywords = Keywords.USER_ACTION,
    Level = EventLevel.Informational)]
    public void LogAction(string action, string newParamName)
    {
        this.WriteEvent(5, action, newParamName);
    }
Run Code Online (Sandbox Code Playgroud)

当为记录事件调用此方法时,将记录它们,并使用参数名称paramName而不是newParamName设置Payload值.

现在,问题是:如何清除"缓存",系统会忘记方法的旧版本,新方法可以正确记录事件?

LE:我用PerfView测试了日志记录.有趣的是,它正确地读取日志.我使用SemanticLogging-svc.exe再次测试,日志仍然显示不正确.看起来问题不在于记录事件,而在于阅读它们.

methods signature out-of-process slab

1
推荐指数
1
解决办法
689
查看次数

进程外COM服务器的注册表项

我正在实现我的第一个进程外COM服务器(我的第一个COM服务器,就此而言).我已按照步骤编写IDL文件,生成代理/存根DLL的代码,编译DLL并注册它.

当我检查注册表项时,我有

  • 一个名为HKEY_CLASSES_ROOT/Interface/<GUID>,其vaue(说)IMyApp
  • 名为key的键HKEY_CLASSES_ROOT/Interface/<GUID>/ProxyStubClsid32,其值为<GUID>,即与键名称中的值相同

我不明白第二个键的值是如何与<GUID>键名相同的值,因为我目前的理解是这样

  • HKEY_CLASSES_ROOT/Interface/<GUID>,GUID是接口 ID
  • ProxyStubClsid32不是接口ID,而是一个 ID指的是实现上述接口组件
  • 的值HKEY_CLASSES_ROOT/CLSID/<GUID>/InprocServer32(其中,GUID是上述 ID)指向代理DLL

那么,HKEY_CLASSES_ROOT/Interface/<GUID>/ProxyStubClsid32如果一个是接口ID而另一个是类ID ,那么如何保持相同值GUID的值?

编辑:我仍然希望得到这个答案.简而言之:由于组件和接口是两个不同的东西,如何同时使用相同的ID?

com out-of-process

0
推荐指数
1
解决办法
4400
查看次数

标签 统计

out-of-process ×8

com ×7

atl ×2

windows ×2

c++ ×1

marshalling ×1

methods ×1

regfreecom ×1

rpc ×1

signature ×1

slab ×1

winapi ×1