我正在尝试用DCOM实现两件事(进程外)
我的想法:
AFAIK auth信息结构包含所有新COM调用的默认身份验证信息(如RPC_C_AUTHN_WINNT的用户名和密码).因此,COM应该使用auth结构中的信息而不是进程令牌.但是,所有COM调用/连接始终使用进程的标识而不是应用的默认标识.
通常,可以使用CoSetProxyBlanket来更改代理的身份验证信息.这适合我.我的问题是,如果我自己模仿令牌并调用COM函数,它是否必须工作.我已阅读各种MSDN文章,将EOAC_DYNAMIC_CLOAKING应用于CoInitializeSecurity应该可以使其正常工作.但是,我手动"模拟的COM调用始终在服务器端显示进程标识.
客户端看起来像这样(Delphi)
var
authList : SOLE_AUTHENTICATION_LIST;
authidentity : SEC_WINNT_AUTH_IDENTITY_W;
authInfo : array[0..1] of SOLE_AUTHENTICATION_INFO;
pcAuthSvc : DWORD;
asAuthSvc : array[0..0] of SOLE_AUTHENTICATION_SERVICE;
Token : TJwSecurityToken;
begin
ZeroMemory( @authidentity, sizeof(authidentity) );
authidentity.User := 'Testbenutzer';
authidentity.UserLength := Length('Testbenutzer');
authidentity.Domain := '';
authidentity.DomainLength := 0;
authidentity.Password := 'test';
authidentity.PasswordLength := 4;
authidentity.Flags := SEC_WINNT_AUTH_IDENTITY_UNICODE;
ZeroMemory( @authInfo, sizeof( authInfo ) );
// NTLM Settings
authInfo[0].dwAuthnSvc := RPC_C_AUTHN_WINNT;
authInfo[0].dwAuthzSvc := RPC_C_AUTHZ_NONE;
authInfo[0].pAuthInfo := @authidentity;
authList.cAuthInfo := 1;
authList.aAuthInfo := …
Run Code Online (Sandbox Code Playgroud) 我听说在Windows x64架构上,为了支持运行x86和x64应用程序,有两个独立/不同的Windows注册表集 - 一个用于x86应用程序访问,另一个用于x64应用程序访问?例如,如果COM在x86注册表集中注册CLSID,那么x64应用程序永远无法通过CLSID访问COM组件,因为x86/x64具有不同的注册表集?
所以,我的问题是我对上述样本的理解是否正确?我还想获得更多文档来学习这个主题,关于x64架构上的两个不同的注册表集.(我做了一些搜索,但没有找到任何有价值的信息.)
有没有从头开始学习C++/COM的好网站?我正在寻找类似于速成课程的内容,可能有两周的内容.
该课程可以采用标准C/C++的知识,或至少不是一个完整的假人.
我们有一个大型的C#(.net 2.0)应用程序,它使用我们自己的C++ COM组件和第三方指纹扫描程序库,也可以通过COM访问.我们遇到了一个问题,在生产过程中,指纹库中的某些事件不会被C#应用程序触发,尽管来自我们自己的C++ COM组件的事件被触发并且收到的很好.
使用MSINFO32将工作系统上加载的模块与发生故障的系统上的模块进行比较,我们确定这是由STDOLE.DLL不在GAC中引起的,因此未加载到故障进程中.
将此文件拖到GAC中会导致事件从指纹COM库恢复正常.
那么stdole.dll做什么?它的大小是16k所以它不能太多......它是否与STDOLE32这样的另一个库有某种联系?它的缺席怎么会导致这种奇怪的行为?
我们如何分发stdole.dll?这是一个XCOPY部署应用程序,我们不使用GAC.我们应该将它打包为资源并使用System.EnterpriseServices.Internal.Publish.GacInstall来确保它在GAC中吗?
在Powershell中,我可以创建COM对象,例如,可以用来控制Microsoft Office应用程序:
$excel = New-Object -com "Excel.Application"
$excel.visible = $true
Run Code Online (Sandbox Code Playgroud)
如何列出可以在Powershell中创建的所有可用COM对象?
我已经读过可以使用COM/ActiveX在Crystal Reports中自动执行月度报告.我不是那么先进,无法理解这是什么,或者甚至可以用它来做什么.
我也使用Excel做了很多工作,看起来你也使用COM/ActiveX与它进行交互.
有人可以解释这是如何工作的,也许可以提供一个简短的例
任何机构都可以告诉我regsvr32和RegAsm有什么区别?我的Dll在C#中,那么如何将类导入到c ++中呢?
在Visual Studio中创建新的C#项目时,生成的AssemblyInfo.cs文件包含指定程序集GUID的属性.属性上方的注释表明它"如果此项目暴露给COM".
我的程序集都没有包含需要对COM可见的类型,因此我已经标记了我的程序集[assembly: ComVisible(false)]
.那么指定GUID有什么意义吗?
我的感觉是答案是"不" - 那么为什么默认的AssemblyInfo.cs文件包含[assembly: ComVisible(false)]
和[assembly: Guid("...")]
?
编辑:
总结一下回答:
在它们之间,答案解释了当且仅当正在使用COM互操作时才需要指定GUID.所以,在我的情况下,没有必要使用GUID.
sharptooth进一步解释说,[assembly: ComVisible(false)]
并不意味着不使用COM互操作,因为可以覆盖ComVisible
各个类型.因此,默认的AssembyInfo.cs包含两者[assembly: ComVisible(false)]
和GUID.
将工作C#项目从64位Windows 7计算机移动到32位XP计算机会导致以下错误:
由于以下错误,检索具有CLSID {681EF637-F129-4AE9-94BB-618937E3F6B6}的组件的COM类工厂失败:80040154.
681EF637-F129-4AE9-94BB-618937E3F6B6不在注册表中,因此未正确安装,但这是以前在64位Windows 7计算机上出现问题的ID.在这里找到了64位Windows 7机器上的此错误的解决方案(将Platform Target更改为x86),但这并没有解决32位XP机器上的问题.我如何找到681EF637-F129-4AE9-94BB-618937E3F6B6,或者甚至更好相关的DLL,我该如何修复此异常?