VC调用VB的COM+组件

colorsky_010 2008-10-30 03:39:29
VC调用远程COM+组件
用VB6向导做成COM+,并在服务器上安装,部分代码如下:(名称为ADOMTS)
Public Function GetADORecordset() As ADOR.Recordset
Dim rsset As ADODB.Recordset
Dim cn As ADODB.Connection
Dim connectstring As String
Dim anerror As ADODB.Error
Dim Sql As String
On Error GoTo rt
connectstring = "Driver={SQL SERVER};Server=192.168.1.123;Database=pubs;UID=sa;"
Sql = "SELECT * FROM authors;"
Set cn = New ADODB.Connection
cn.ConnectionString = connectstring
cn.CursorLocation = adUseClient
cn.Open
Set rsset = cn.Execute(Sql)
Set GetADORecordset = rsset
Exit Function
rt:
For Each anerror In cn.Errors
Debug.Print anerror.Number & ": " & anerror.Description & " - " & anerror.SQLState
Next anerror
End Function

然后用VC6封装DLL(工程名为connect),远程调用COM+组件(将服务器上的组件导出并在客户端上安装)。利用VC MFC

CLASSWIZARD添加新类,import from type library,将ADOMTS.tlb添加进去。部分代码如下:
int _stdcall GETUSPW()
{

_clsAdoRec * pAccount;
IUnknown *pUnknown;
HRESULT hr;
CoInitialize(NULL);//初始化COM环境
hr = CoInitializeSecurity(
NULL, //Points to security descriptor
-1, //Count of entries in asAuthSvc
NULL, //Array of names to register
NULL, //Reserved for future use
RPC_C_AUTHN_LEVEL_DEFAULT, //The default authentication level for proxies
RPC_C_IMP_LEVEL_IDENTIFY, //The default impersonation level for proxies
NULL, //Reserved; must be set to NULL
0, //Additional client or server-side capabilities
NULL //Reserved for future use
);

COAUTHINFO sAuthInfo;
sAuthInfo.dwAuthnSvc = RPC_C_AUTHN_DEFAULT;
sAuthInfo.dwAuthnLevel = RPC_C_AUTHN_LEVEL_DEFAULT;
//sAuthInfo.dwAuthzSvc = RPC_C_AUTHZ_DEFAULT;
sAuthInfo.dwAuthzSvc = RPC_C_AUTHZ_NONE;
// sAuthInfo.dwCapabilities = EOAC_NONE;//must be
sAuthInfo.dwImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE;//must be
sAuthInfo.pwszServerPrincName = NULL;
sAuthInfo.pAuthIdentityData = (COAUTHIDENTITY*)malloc(sizeof(COAUTHIDENTITY));
sAuthInfo.pAuthIdentityData->User = L"test" ;//访问远程对象所在主机的用户名,宽字符串
sAuthInfo.pAuthIdentityData->UserLength =4; //用户名的字符长度
sAuthInfo.pAuthIdentityData->Password = L"test" ;//密码,宽字符串
sAuthInfo.pAuthIdentityData->PasswordLength = 4; //密码长度
sAuthInfo.pAuthIdentityData->Domain = NULL; //远程主机的域,如果没有域则设置为NULL
sAuthInfo.pAuthIdentityData->DomainLength = 0;//域名长度
sAuthInfo.pAuthIdentityData->Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
COSERVERINFO serverInfo;
memset(&serverInfo, 0, sizeof(COSERVERINFO));
serverInfo.pwszName = L"192.168.1.10"; //远程主机的名称
serverInfo.pAuthInfo = &sAuthInfo;
MULTI_QI qi;
memset(&qi, 0, sizeof(MULTI_QI));
qi.pIID = &IID_IUnknown;

CLSID CLSID_InsideCOM = {0xAB363305,0x981B,0x11D1,{0x92,0x92,0x00,0xAA,0x00,0x51,0x0E,0x3B}};
const IID IID_IAccount={0xB363304,0x981B,0x11D1,{0x92,0x92,0x00,0xAA,0x00,0x51,0x0E,0x3B}};

hr=CoCreateInstanceEx(CLSID_InsideCOM,NULL,CLSCTX_REMOTE_SERVER,&serverInfo,1,&qi);
pUnknown = (IUnknown *) qi.pItf;
hr = pUnknown->QueryInterface(IID_IAccount,(void**)&pAccount);
pAccount->GetADORecordset();
pUnknown->Release();


return 0;


}
调用该DLL,单步调试的时候,程序走到CoCreateInstanceEx函数时候没有问题,接着执行接口查询操作

QueryInterface,hr返回0x80070005,访问被拒绝。实在弄不明白,都已经CoCreateInstanceEx成功了,为什么

QueryInterface不成功呢?是我代码写的有问题吗?大家帮我看看,谢谢
...全文
89 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
CathySun118 2008-11-02
  • 打赏
  • 举报
回复
参考:http://www.microsoft.com/technet/prodtechnol/winxppro/maintain/sp2netwk.mspx#EXDAC
colorsky_010 2008-10-31
  • 打赏
  • 举报
回复
怎么就没人回贴呢?
colorsky_010 2008-10-31
  • 打赏
  • 举报
回复
怎么就没人回贴呢?
Grid++Report 报表构件适用开发工具广泛:VB.NET、C#.NET、VBVC、Delphi、CBuilder、PowerBuilder等一切支持 COM 的开发工具。除了提供报表的打印、打印预览、数据导出等一般功能,还提供独有的报表查询显示功能,为你提供最全面的报表解决办法。实现表格报表、动态报表、多层表头、票据套打、交叉表等特殊报表非常简便。提供了多个开发工具下的丰富例程,让你快速理解本产品,安装程序中包含丰富的可运行例子,安装后即刻体验 Grid++Report。Grid++Report 报表构件具有如下特点:1). 适用范围广:VB.NET、C#.NET、VBVC、Delphi、CBuilder、PowerBuilder等一切支持 COM 的开发工具。2). 功能强大:实现普通格式报表、表格报表、动态报表、多层表头、票据套打、交叉表等各种报表非常简便。3). 独有的报表查询显示功能:除了提供报表的打印、打印预览、数据导出等功能,还提供独有的报表查询显示功能,为你提供最全面的报表解决办法。4). 易学易用:完全可视化设计。编写了完整详尽的帮助文档。提供了丰富例程,包括VB.NET、C#、VBVC、Delphi、CBuilder。安装程序中包含可运行例子,安装后即刻体验 Grid++Report。5). 为 Delphi、C++Builder 编写专门的包装类,象使用 VCL 构件一样使用 Grid++Report。6). 重新发布简单:只用分发两个 DLL 文件。7). 提供免费版本供广大开发者使用。
Grid++Report是一款同时支持C/S软件(桌面程序)与B/S软件(WEB程序)开发的报表工具,功能全面易学易用。C/S开发适用于VB.NET、C#、VB6、VBVC、Delphi、C++Builder、QT与易语言等。B/S开发适用于ASP.NET(C# & VB.NET),PHP,JSP(JAVA)等,支持所有WEB服务器。开发C/S报表与B/S报表的编程接口、报表模板与报表数据通用,共享相同的开发知识与设计资源。 1. 含C/S报表组件、WEB报表插件、HTML5报表与WEB报表服务器开发的相关文件。 2. 通用报表设计器应用程序,可视化设计报表模板,报表组件、报表插件与HTML5报表都用此程序设计报表模板,同一报表模板可为三种开发模式共 用。 3. 包含大量各种类型,各行各业的报表模板例子,是学习报表设计的最好参考资源。 4. 包含桌面报表(C/S)组件、WEB报表插件、HTML5报表与WEB报表服务器的程序文件与例子文件。报表组件例子程序包括:C#, VB.NET, VB, VC, Delphi, C++Builder、中文编程易语言。Web报表例子程序包括:asp.net(c#)、asp.net(vb)、php、jsp。还有可直接运行的例子应用程序。 帮助文档及其它有关Grid++Report的文档与资源。 5. 请根据帮助文档中的相关说明,首先把例子程序运行起来。请尽量模仿最简单的例子程序开始学习。 6. 整理了C/S报表组件免COM注册发布软件的方法,实现绿色发布用Grid++Report开发的软件,并避免不同版本的Grid++Report发布在同一台电脑的冲突

864

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧