我正在使用两台机器上的服务器和客户端的DCOM应用程序,这两台机器都运行带有Service Pack 2的WinXP.在两台机器上,我使用相同的用户名和密码登录.
当一台计算机上的客户端调用CoCreateInstanceEx,要求另一台计算机启动服务器应用程序时,它将返回E_ACCESSDENIED.
我尝试进入dcomcnfg中的服务器应用程序的组件属性,并为所有人提供完整的权限,但这没有帮助.
要使此调用成功,我需要做什么?
更新:当服务器应用程序在Windows 2000机器上运行时,我不会收到此错误; CoCreateInstanceEx返回S_OK.
我希望每个人都会赦免这个问题的长度和叙事方式.我决定在我的博客中详细描述这种情况.后来我看到Joel对这个网站的邀请,我想我会把它粘贴在这里,看看有没有人对这种情况有所了解.
我编写并现在支持一个应用程序,该应用程序由一个Visual Basic胖客户端组成DCOM,使用ATL用C++编写的中间层COM +组件.它遍布我们所有的八个办事处.每个办公室都托管一个后端服务器,其中包含COM +应用程序(由18个独立组件组成)和SQLServer.SQLServer通常位于同一个后端服务器上,但不一定是这样.
我们最近将我们最大的办公室 - 纽约的后端服务器从MSC群集迁移到VMWare ESX技术上托管的新虚拟机.由于COM +应用程序的位置已从旧服务器移动到具有不同名称的新服务器,因此我不得不重定向所有客户端,以便它们在新服务器上激活COM +应用程序.这个过程很老套,因为我对几个经过类似基础设施升级的小型办公室做了同样的事情.
一切似乎都很常规,周一早上整个办公室 - 大约1,000个Windows XP工作站 - 在新服务器上运行时没有发生任何事故.但随后电话来自我的移动组 - 有一位律师在家工作,VPN连接在被重定向到新服务器后出现了一个奇怪的错误:
Error on FillTreeView2 - The stub received bad data.
咦?我以前从未见过这个错误信息.是新服务器吗?但办公室的所有工作站都运转正常.我告诉移动组将律师转回旧服务器(仍在运行),错误消失了.那有什么区别?原来这位律师在家里运行Vista.
我们不在任何办公室运行Vista,但我们确实有一些在家里运行Vista的律师(肯定是我在纽约办公室的一些).我也这样做,我从未见过这个问题.为了确认存在问题,我启动了我的Vista笔记本电脑,指向新服务器,并得到了同样的错误.我把它指回旧服务器,它工作正常.显然,Vista和新服务器上的组件存在一些问题 - 这个问题似乎不会影响XP客户端.会是什么呢?
下一站 - 笔记本电脑上的应用程序错误日志.这产生了有关错误的更多信息:
Source: Microsoft-Windows-RPC-Events Date: 9/2/2008 11:56:07 AM Event ID: 10 Level: Error Computer: DevLaptop Description: Application has failed to complete a COM call because an incorrect interface ID was passed as a parameter. The expected Interface ID was 00000555-0000-0010-8000-00aa006d2ea4, The Interface ID returned was 00000556-0000-0010-8000-00aa006d2ea4. User …
我开发了一个C#程序,它从SQL Server数据库中提取数据,然后生成包含数据的Word文档.我已将程序设置为在Windows Server 2003框上作为SSIS作业的一部分运行.该程序以用户SQLSVC运行,该用户没有管理权限.当我以SQLSVC身份登录并运行程序时,它会正确执行.但是,当程序作为SSIS作业自动运行时,它会冻结在以下代码行中
Microsoft.Office.Interop.Word.Application word =
new Microsoft.Office.Interop.Word.Application();
Run Code Online (Sandbox Code Playgroud)
当我强行终止进程时,会生成以下错误消息.
Error Message: System.Runtime.InteropServices.COMException (0x80080005):
Retrieving the COM class factory for component
with CLSID {000209FF-0000-0000-C000-000000000046}
failed due to the following error: 80080005.
at IepGlance.Program.CreateNewIepFiles(Dictionary`2
iepDictionary, EasyIepDataContext dbContext)
at IepGlance.Program.Main(String[] args)
Run Code Online (Sandbox Code Playgroud)
据我所知,问题在于DCOM权限.我已经使用dcomcnfg将所有可能的DCOM权限添加到用户SQLSVC,但这没有帮助.还有其他可能的解决方案吗?
我们在Windows 2003 Server上运行DataSnap Delphi 2009应用程序.DataSnap客户端和服务器在Borland Socketserver上使用DCOM在同一台计算机上.客户端运行后台批处理作业.
有时,我们发现客户端无法连接到服务器应用程序并在服务器桌面上显示消息对话框,指示例如"无法连接到服务器.无法找到网络路径".或者"找不到Objectexporter".
我们的Delphi客户端代码从不使用消息对话框来显示错误或异常,而是使用try ... except .. finally ... end和logging来处理连接错误,所以我猜对话框是由DataSnap方法创建的.有没有办法抑制这个模态对话框?
更新:所有异常都在较低级别的例程中处理,主循环负责在引发异常(处理或未处理)时断开连接并重新连接:
while True do
begin
Connect;
while True do
begin
try
DoMyWork;
except
Break;
end;
end;
Disconnect;
end;
Run Code Online (Sandbox Code Playgroud) 我正在.NET 4(VS2010,C#)中开发DCOM服务器。就其本身而言,这工作得很好。
现在,我还需要为此 DCOM 服务器开发一个 .NET 客户端,但我无法添加对 TypeLib 的引用。Visual Studio 会告诉我类型库是从 .NET 程序集导出的,无法添加为引用。
这个问题的答案表明我应该能够用来TlbImp.exe生成包装器程序集,但它也会拒绝这样做:
TlbImp:错误 TI1029:类型库“MyWrapper”是从 CLR 程序集导出的,无法作为 CLR 程序集重新导入。
我知道,从纯粹的 .NET 角度来看,为此使用 DCOM 可能没有多大意义。但是,同一服务器也应该可以从非 .NET 应用程序访问。
我尝试过将 tlb 转换为 IDL 并从中重新生成 tlb,但这并不能欺骗 Visual Studio。
也许可以在重新生成之前稍微修改 IDL,或者是否有某种方法强制使用 DCOM,即使服务器和客户端都是用 .NET 编写的?
我必须将我的.NET服务器应用程序与供应商的产品集成.供应商的产品将在其自己的服务器上,并且具有受支持和记录的API,但是,仅作为COM对象.由于DCOM和.NET远程处理都已弃用,是否支持(即不存在在.NET 5中被删除的风险)方式来执行此集成,而无需在我的供应商框和Web客户端上创建和安装Web服务框将这些请求通过网络代理到COM?
请注意,我很乐意编写和使用Web服务(我可以使用REST,必要时使用SOAP).我只是想保持这个应用程序的地形简单,避免双重部署等.出于同样的原因,我已经避免了WCF,因为它看起来像很多开销,但如果WCF支持暴露底层的COM接口网络,我很乐意使用它.否则,我想我正在设计,编写,部署和使用这个新的Web服务.请告诉我我不必这样做!
我正在编写一个具有大量接口和方法的 COM 服务器。并且大多数方法都以 BSTR 作为参数和用于返回的本地参数。一个片段看起来像
更新 5:
真正的代码。这基于特定条件从 DB 的一堆数据中获取以填充对象数组。
STDMETHODIMP CApplication::GetAllAddressByName(BSTR bstrParamName, VARIANT *vAdddresses)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
//check the Database server connection
COleSafeArray saAddress;
HRESULT hr;
// Prepare the SQL Strings dan Query the DB
long lRecCount = table.GetRecordCount();
if (lRecCount > 0)
{
//create one dimension safe array for putting details
saAddress.CreateOneDim(VT_DISPATCH,lRecCount);
IAddress *pIAddress = NULL;
//retrieve details
for(long iRet = table.MoveFirst(),iCount=0; !iRet; iRet = table.MoveNext(),iCount++)
{
CComObject<CAddress> *pAddress;
hr = CComObject<CAddress>::CreateInstance(&pAddress);
if (SUCCEEDED(hr))
{
BSTR bstrStreet = ::SysAllocString(table.m_pRecordData->Street); …Run Code Online (Sandbox Code Playgroud) 什么是
#define _WIN32_DCOM
Run Code Online (Sandbox Code Playgroud)
在一个visual c ++项目中?如果我想将应用程序构建目标定位到x64,我是否需要将其更改为WIN64_DCOM对象?
我想在操作后将Excel文件打印到pdf文件中。对于操作,我使用了.xlsx运行良好的包。有一个功能,printSetup但我找不到开始打印的功能。有解决方案吗?
library(xlsx)
file <- "test.xlsx"
wb <- loadWorkbook(file)
sheets <- getSheets(wb) # get all sheets
sheet <- sheets[[1]] # get first sheet
# HERE: MAGIC TO SAVE THIS SHEET TO PDF
Run Code Online (Sandbox Code Playgroud)
它可能是通过包使用DCOM的解决方案RDCOMClient,但我更喜欢平台独立的解决方案(例如使用xlsx),因为我在 MacOS 上工作。有任何想法吗?
我正在使用 WMI(Windows 管理规范)尝试从一组远程计算机收集一些信息。问题是,每次我尝试使用以下命令启动与远程计算机/资源的连接:
//IWbemLocator::ConnectServer method (wbemcli.h)
m_pLoc->ConnectServer ....
Run Code Online (Sandbox Code Playgroud)
在哪里
IWbemLocator *m_pLoc;
Run Code Online (Sandbox Code Playgroud)
(可以假设m_pLoc已正确初始化),如果远程资源不可用,Windows会在Windows事件查看器中生成日志事件:
DCOM 无法使用任何配置的协议与计算机进行通信;PID 请求......
问题是,鉴于大量远程设备在某些时候无法访问,日志会被淹没。
每次我尝试启动连接时,是否有任何方法可以控制或阻止 Windows 在事件查看器中推送事件?似乎争论:
IWbemLocator::ConnectServer method (wbemcli.h)
Run Code Online (Sandbox Code Playgroud)
或
CoCreateInstance用于初始化 IWbemLocator 不允许我正在寻找的这种非常自定义的配置。有什么建议或替代方案吗?谢谢你!