社区
ATL
帖子详情
2000下使用DCOM,天哪,救我把
yangmajituipo
2001-07-31 08:17:16
http://www.csdn.net/expert/topic/217/217686.shtm
http://www.csdn.net/expert/topic/210/210892.shtm
http://www.csdn.net/expert/topic/217/217146.shtm
http://www.csdn.net/expert/topic/215/215476.shtm
...全文
242
25
打赏
收藏
2000下使用DCOM,天哪,救我把
http://www.csdn.net/expert/topic/217/217686.shtm http://www.csdn.net/expert/topic/210/210892.shtm http://www.csdn.net/expert/topic/217/217146.shtm http://www.csdn.net/expert/topic/215/215476.shtm
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
25 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
ShipDrink
2001-08-16
打赏
举报
回复
敬请关注
专家门诊/扩充话题/软件市场/
“中国人只能做MIS软件吗?有兴趣合作“通用软件“吗?开发模式可以学习Linux”(ShipDrink)
内核已经写好,非常干净,原码公开
(
70000行,其中50000行为手写,核心代码30000行
(无注释)目前版本是1.5,经历了1.0,1.1,1.2,1.4等
版本,其中1.1和1.5版本都曾作了极大改进,变化
较大结构更加紧凑,编码更加合理,使用了部分
COM原理但又不是COM,编译完,1.4版本为1.9M,
1.5为900K,这从一个侧面反映了布局和编码的合理性。
注:请对比一下
Acrobat (正版2000元,我用得是正版)安装完为140M,
但其核心代码为4.9M,
Delphi6 (正版)安装完为600M,但其核心代码也仅为几兆,
且编译程序中还包括大量资源(如位图,图标,对话框等)。
),
如果你你有开发热情,可以索要帮助文档,
你可以为它升级。但你不会赚钱。
因为赚钱的不是内核部分,
wyzegg
2001-08-06
打赏
举报
回复
如果指定但是没有给这个用户访问和启动的权限也不行的,好象一定要有network有权限,这个问题我也有疑惑,看看我的哪个帖子就知道啦http://www.csdn.net/expert/topic/217/217656.shtm
yangmajituipo
2001-08-06
打赏
举报
回复
谢天谢地,我的问题终于解决
主要是组册表没写对,错一项都不行
但跟 [ APPID一样应该不行吧 ] 无关
光写remoteservernam也不行
宁外,蛋兄,我看了你的例子,为啥
COSERVERINFO ServerInfo={0,L"x.x.x.x",0,0};
能行
但指定有权的用户不行,
COSERVERINFO ServerInfo={0,L"x.x.x.x",&AuthInfo,0}
该用户为远程机器Administrator成员
请继续讨论
还有一个问题
多个客户端能否同享一个服务器对象实例,如何实现
yangmajituipo
2001-08-04
打赏
举报
回复
蛋兄,我先看看
结100分
wyzegg
2001-08-04
打赏
举报
回复
我的程序也已经上传啦。其实很简单的,你的应该没有问题啦吧
yangmajituipo
2001-08-04
打赏
举报
回复
我现在不需要在程序中改动
这样吧,我把它上传导文档中心
http://www.csdn.net/filebbs/read_topic.asp?id=386
告诉我你的实现方法,再次先谢了
标题:Inside com+DLL代理例子
cbc
2001-08-03
打赏
举报
回复
up
wyzegg
2001-08-03
打赏
举报
回复
AccessPermission,ActivateAtStorage,AuthenticationLever
DllSurrogate,LaunchPermmition,LocalServer
Runas,ServerParameters
这些设置都可以用dcomcnfg来配置,本来DLL的组件在dcomcnfg中是看不到的,但是加上APPID后就可以看到的啦
你做的组件恐怕没有appid需要用uuidgen生成一个uuid(任意)比如
cf39d99d-50e8-42b6-b233-14b6da43351
最初我也是一个ATL做的DLL组件,后来手动加上APPID的,其实有关注册表怎么加都一样的
你的appid和clsid一样恐怕不行的所以使用生成的UUID
[HKEY_CLASSES_ROOT\CLSID\{10000002-0000-0000-0000-000000000001}]
"AppID"="{cf39d99d-50e8-42b6-b233-f14b6da43351}"
@="Inside COM Sample"
然后在[HKEY_CLASSES_ROOT\AppID\{cf39d99d-50e8-42b6-b233-f14b6da43351}]
@="Inside COM+ Sample"
"dllsurrogate"="...\\dllnanny.exe"
这样是服务器端的设置,你的问题APPID和CLSID一样的
在客户端如果象我那样在程序中指定远程服务器,就不需要在注册表中改
否则在
[HKEY_CLASSES_ROOT\AppID\{cf39d99d-50e8-42b6-b233-f14b6da43351}]
@="Inside COM+ Sample"
"remoteservername"="hostname"
这样就可以啦
最后在讲一下如果使用自定义接口一定要proxy/stub程序的
yangmajituipo
2001-08-03
打赏
举报
回复
谢了,请继续
yangmajituipo
2001-08-03
打赏
举报
回复
非常感谢,分数一定给〉300
我的Component IDL
[ object, uuid(10000001-0000-0000-0000-000000000001),
oleautomation ]
因此,我不需要创建Proxy/stub dll 吧
引
1. 代理问题
进程内组件为dll,当需要远程调用时需要在本地有一个代理程序,缺省的代理
程序是dllhost.exe。需要在
HHEY_CLASSES_ROOT\APPID\6698c102-8e22-4e93-a9cd-ba4421901cb
下添加字符串值dllsurrogate值为代理程序所处的位置,
如果值为空表示使用缺省代理。
我用的代理程序为dllnanny.exe
调用时使用hr = CoCreateInstance(CLSID_InsideCOM, NULL, CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pUnknown);
不在程序中指定远程服务器
远程机为2000无密码就可进入
客户机也为2000
但就是不行
在本地能运行
注册表为
[HKEY_CLASSES_ROOT\CLSID\{10000002-0000-0000-0000-000000000001}]
"AppID"="{10000002-0000-0000-0000-000000000001}"
@="Inside COM Sample"
[HKEY_CLASSES_ROOT\CLSID\{10000002-0000-0000-0000-000000000001}\InprocServer32]
@="E:\\Code\\Surrogates\\Component\\Debug\\Component.dll"
[HKEY_CLASSES_ROOT\CLSID\{10000002-0000-0000-0000-000000000001}\ProgID]
@="Component.InsideCOM.1"
[HKEY_CLASSES_ROOT\CLSID\{10000002-0000-0000-0000-000000000001}\VersionIndependentProgID]
@="Component.InsideCOM"
[HKEY_CLASSES_ROOT\AppID\{10000002-0000-0000-0000-000000000001}]
@="Inside COM+ Sample"
"dllsurrogate"="...\\dllnanny.exe"
这时系统能自动找到代理程序dllnanny.exe并创建本地com
如果要远程访问,客户机如何,服务器注册表又如何
此时客户机,我用remoteservername指定并不好使,Inprocserver32须改否,还有其它设置
AccessPermission,ActivateAtStorage,AuthenticationLever
DllSurrogate,LaunchPermmition,LocalServer
Runas,ServerParameters如何处理
yangmajituipo
2001-08-02
打赏
举报
回复
thank you
光在本地就运行不了
跟"remoteservername"="hostname"无关
远程组件是DCOM
wyzegg
2001-08-02
打赏
举报
回复
还有问题?
yangmajituipo
2001-08-02
打赏
举报
回复
我统计了一下
分数〉600,我还要继续加分
yangmajituipo
2001-08-02
打赏
举报
回复
goto
http://www.csdn.net/expert/topic/210/210892.shtm
wyzegg
2001-08-02
打赏
举报
回复
以上程序都经测试通过,给分啦
wyzegg
2001-08-02
打赏
举报
回复
简单例子服务器的程序名为
1.surrogatesvr.dll
2.代理程序名surrogate.exe
3.proxy/stub程序名为stdmarshel.dll
4.客户程序名为surrogateclient.exe
下面是客户的源代码
接口名字为ISObject
有一个方法Mul做乘法运算
注释掉的部分是用IDispatch访问(此时可以不需要注册proxy/stub程序stdmarshel.dll)
也可以调用成功
#include "stdafx.h"
#include "stdio.h"
#define _WIN32_DCOM
#include "surrogatesvr.h"
#include "iostream.h"
#include "atlbase.h"
const IID IID_ISObject = {0xC4A7C2E7,0x5EAC,0x4367,{0x8F,0x0D,0x59,0xEC,0xDB,0x66,0xCE,0x3B}};
const IID LIBID_SURROGATESVRLib = {0x09C7CB7B,0x8205,0x4C8E,{0xA4,0xB0,0xCF,0x23,0x0D,0x66,0xAD,0xB0}};
const CLSID CLSID_SObject = {0x164AC944,0x1217,0x43DB,{0xBC,0x1A,0xB6,0x60,0x7C,0x58,0xA2,0xB3}};
long Mul( int x,int y)
{
USES_CONVERSION;
COSERVERINFO ServerInfo={0,L"139.1.8.5",NULL,0};
MULTI_QI qi[2]={{&IID_IUnknown,NULL,0},{&IID_ISObject,NULL,0}};
HRESULT hr;
ISObject *pSObject;
LPUNKNOWN pUnknown;
hr=CoCreateInstanceEx(CLSID_SObject ,NULL,CLSCTX_REMOTE_SERVER,&ServerInfo,2,(MULTI_QI*)&qi);
if(FAILED(hr))
return -1;
long z;
pUnknown=qi[0].pItf;
hr=pUnknown->QueryInterface(IID_ISObject,(void **)&pSObject);
if(FAILED(hr)
return -1;
pUnknown->Release();
pSObject->Mul(x,y,&z);
pSObject->Release();
return z;
/*
IDispatch *pDisp;
EXCEPINFO excepinfo;
UINT uArgErr;
hr=pUnknown->QueryInterface(IID_IDispatch,(void **)&pDisp);
if(FAILED(hr))
{
pUnknown->Release();
return -1;
}
DISPID dispid;
BSTR bstr=::SysAllocString(OLESTR("Mul"));
hr=pDisp->GetIDsOfNames(IID_NULL,&bstr,1,LOCALE_USER_DEFAULT,&dispid);
::SysFreeString(bstr);
if(hr)
{
return NULL;
}
DISPPARAMS dispparams={NULL, NULL, 0, 0};
try
{
dispparams.cArgs = 2;
dispparams.rgvarg = new VARIANTARG;
dispparams.rgvarg[0].vt = VT_I4;
dispparams.rgvarg[0].lVal = x;
dispparams.rgvarg[1].vt = VT_I4;
dispparams.rgvarg[1].lVal=y;
dispparams.cNamedArgs = 0;
}catch(...)
{
int i=0;
}
VARIANTARG variantarg;
VariantInit(&variantarg);
::memset(&excepinfo,0,sizeof(EXCEPINFO));
uArgErr=0;
//hr=pDisp->Invoke(dispid,IID_NULL,LOCALE_USER_DEFAULT,DISPATCH_PROPERTYGET,&dispparams,&variantarg,&excepinfo,&uArgErr);
hr=pDisp->Invoke(dispid,IID_NULL,LOCALE_USER_DEFAULT,DISPATCH_METHOD,&dispparams,&variantarg,&excepinfo,&uArgErr);
if(hr)
{
return NULL;
}
pDisp->Release();
return variantarg.lVal;
*/
}
int main(int argc, char* argv[])
{
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
if(FAILED(hr))
return -1;
printf("%d\n",Mul(9,57));
CoUninitialize();
return 0;
}
wyzegg
2001-08-02
打赏
举报
回复
1. 代理问题
进程内组件为dll,当需要远程调用时需要在本地有一个代理程序,缺省的代理
程序是dllhost.exe。需要在
HHEY_CLASSES_ROOT\APPID\6698c102-8e22-4e93-a9cd-ba4421901cb8
下添加字符串值dllsurrogate值为代理程序所处的位置,
如果值为空表示使用缺省代理。
2. 调度问题
微软只实现啦IDsiaptch接口的调度,如果我们希望在远程调用客户程序中使用自定义接口
就需要实现接口的调度程序,幸运的是,MIDL已经为我们产生了标准调度代码,我们只需要使用这些代码
生成一个DLL的调度程序。这些代码包括xxx_i.c,xxx.p.c,xxx.h.这些代码可以自动的导出
DllGetClassObject
DllCanUnloadNow
DllRegisterServer
DllUnregisterServer
函数
这样我们可以建立一个WIN32 DLL的工程添加一个DEF文件编译后,在服务器和客户端注册。
就是一个一个标准的调度程序,在该DLL的支持下可以实现自定义接口的远程调度。
注册表项为
[HKEY_CLASSES_ROOT\CLSID\{C4A7C2E7-5EAC-4367-8F0D-59ECDB66CE3B}]
@="PSFactoryBuffer"
[HKEY_CLASSES_ROOT\CLSID\{C4A7C2E7-5EAC-4367-8F0D-59ECDB66CE3B}\InProcServer32]
@="调度程序路径"
"ThreadingModel"="Both"
[HKEY_CLASSES_ROOT\Interface\{C4A7C2E7-5EAC-4367-8F0D-59ECDB66CE3B}]
@="ISObject"
[HKEY_CLASSES_ROOT\Interface\{C4A7C2E7-5EAC-4367-8F0D-59ECDB66CE3B}\NumMethods]
@="方法数目"
[HKEY_CLASSES_ROOT\Interface\{C4A7C2E7-5EAC-4367-8F0D-59ECDB66CE3B}\ProxyStubClsid32]
@={C4A7C2E7-5EAC-4367-8F0D-59ECDB66CE3B}
以上注册表项都是有调度程序自动注册的
3.客户端的问题
远程服务器的名字 可在注册表中用remoteservername指定
也可以在程序中指定,
下面例子就是在程序中指定的
4.安全性问题,
包括公开的安全性和编程的安全性
如果允许匿名用户访问则指定guest或network或internet内置用户的访问
当然也可以指定用户访问。
5.remark
a.如果是DLL的组件,要远程调用需要代理程序的支持,如果有代理程序并且组件支持IDispatch接口,
则可以使用IDispatch远程访问。
b,如果是DLL的组件,要远程调用,使用自定义接口。则不仅需要代理程序的支持也需要proxy/stub调度
程序的支持
c.exe的组件不需要代理程序,但是如果使用自定义接口仍然需要调度DLL的支持。
两者都可以使用公开的安全性和编程的安全性
6.mts
mts是COM运行的平台,已经上述功能,并且可以导出客户端的安装。有很方便的管理
yangmajituipo
2001-08-02
打赏
举报
回复
对不起,笔误,服务器组件为DLL
在本地不能运行,是因为我未注册component.dll
但是远程的方法仍然不行。
远程需要在客户端注册表写DLLSurrogate=“”吗
服务器端又应是啥
yangmajituipo
2001-08-02
打赏
举报
回复
对不起,笔误,服务器组件为DLL
在本地不能运行,是因为我未注册component.dll
但是远程的方法仍然不行。
远程需要在客户端注册表写DLLSurrogate=“”吗
服务器端又应是啥
wyzegg
2001-08-01
打赏
举报
回复
缺省的代理程序是dllhost.exe,但远程也需要在注册表中指定remoteservername,
加载更多回复(5)
D
COM
在远程系统中的
使用
D
COM
在远程系统中的
使用
D
COM
(分布式组件对象模型)是微软的一个概念和程序接口,通过D
COM
,客户端程序对象能够向网络中的另一台计算机上的服务器程序对象发送请求 通过本地D
COM
执行命令 1,获取D
COM
程序列表 Get-...
win10系统下的D
COM
配置
OPC远程访问OPCServer的D
COM
配置保证OPCServer和Client在局域网内OPC环境配置D
COM
配置如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右...
利用D
COM
实现远程命令执行
实现命令执行的方式之前我写过文章来总结,前两
天
又发现了一个新方法D
COM
,于是有了这篇文章。 2.实现过程 2.1通过D
COM
在本机执行命令 实现条件: 管理员权限的powershell 查找D
COM
组件MMC Application Class如下图...
OPC D
COM
快速配置
另外的一个问题是硬件的抢占,如串口,当一个
使用
了,其它的用户就无法再
使用
。a.在右边的Windows的窗口里,找到需要配置的OPC Server,右击该Server,在弹出的菜单里选择属性选项,进行OPC Server的特殊设置,在OPC...
D
COM
远程调用权限设置
最近几
天
被搞得焦头烂额,由于D
COM
客户端程序是在32位系统下开发的,调试时D
COM
服务端也是安装在同一台机器上,所有过程一直还算顺利。可这次项目实施的时候,采购的一台服务器只能安装2008 64位,D
COM
服务端必须...
ATL
3,245
社区成员
48,539
社区内容
发帖
与我相关
我的任务
ATL
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
复制链接
扫一扫
分享
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章