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 打赏 收藏 转发到动态 举报
写回复
用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)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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