进程外服务器

xuxian02092213 2009-11-01 08:55:10
加精
我看了《ATL开发指南》第四章的源代码,发现应用程序编译时自动运行应用程序,并注册了组件,我在注册表中组件的相应信息,这个在VC中时如何设置,我并不清楚,还有更重要的就是,我使用客户端程序,一调用CoCreateInstance(CLSID_Math,NULL,CLSCTX_LOCAL_SERVER,IID_IMath,(void**) &pMath );后,服务器端应用程序立即退出,自然,客户端出现错误,无法继续运行下去,不知道那位能帮助在下。不胜感激
...全文
774 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
jycz 2009-12-05
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
雪影 2009-11-08
  • 打赏
  • 举报
回复
已发至邮箱
xuxian02092213 2009-11-08
  • 打赏
  • 举报
回复
楼上的,真的不骗你啊,资源为0/1,下载速度一直是0,而且昨天还直接跳出那个什么无法下载资源的,跳了两次,我重新双击下载,依然是速度为0啊
jameshooo 2009-11-08
  • 打赏
  • 举报
回复
同一个问题已经300分了……
cynical_man 2009-11-07
  • 打赏
  • 举报
回复
又一次回到这个平台了
雪影 2009-11-07
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 xuxian02092213 的回复:]
13#楼的,我下载代码下不了,我的邮箱是 xuxian02092213@163.com,麻烦你发我邮箱下,谢谢了
[/Quote]
那代码又不要资源分的,怎么会下载不了呢?
想偷懒啊 呵呵
xuxian02092213 2009-11-07
  • 打赏
  • 举报
回复
13楼这句话是什么意思啊:打开project->setting,然后选择您的项目,单击c + + 选项卡并添加到预处理器定义字段的值REGISTER_PROXY_DLL以及_win32_winnt=0x400;
,该怎么操作啊?
xuxian02092213 2009-11-07
  • 打赏
  • 举报
回复
13#楼的,我下载代码下不了,我的邮箱是 xuxian02092213@163.com,麻烦你发我邮箱下,谢谢了
xuxian02092213 2009-11-07
  • 打赏
  • 举报
回复
非常感谢13楼的
ren197836yuan 2009-11-07
  • 打赏
  • 举报
回复
天书一样。。。。
chenzhidong10 2009-11-06
  • 打赏
  • 举报
回复
建议楼主看看COM原理与应用
wishfly 2009-11-05
  • 打赏
  • 举报
回复
mark
xuxian02092213 2009-11-04
  • 打赏
  • 举报
回复
楼上的,说到:否则,客户端得通过代理存根DLL来调用服务器的对象方法,这个代理和残根DLL如何生成呢?
雪影 2009-11-04
  • 打赏
  • 举报
回复
哈哈
好人做到底
源代码也给你传上来了,代理存根dll在.\proxy_stub文件夹下
http://download.csdn.net/source/1792728
wshcdr 2009-11-04
  • 打赏
  • 举报
回复
LZ发了两遍,楼上也重复了一次
雪影 2009-11-04
  • 打赏
  • 举报
回复
代理存根DLL的创建 :
1.通过MIDL编译器自动生成 projectXX.h,dlldata.c,projectXX_i.c,projectXX_p.c文件
对于vc6.0,在文件视图(FileView)树形栏中,找到接口定义的idl文件,点击右键,单击setting,在Custom Build选项卡中输入一下信息.
Description:
Compiling Interface Definition

Build Commands:
midl.exe /ms_ext /char unsigned /c_ext /out "$(InputDir)"
"$(InputPath)"

Output File(s):
$(InputDir)\$(InputName).h
$(InputDir)\dlldata.c
$(InputDir)\$(InputName)_i.c
$(InputDir)\$(InputName)_p.c

2.设置完后,在idl文件处,再次点击右键选择编译projectXX.idl文件.
做完这一步之后,在项目文件夹下面我们会找到上述的四个文件.

3.在新的项目工作区或现有的工作区中,创建一个态链接库项目.将前面的四个文件添加到该项目之中.
并新建一个PSProjectXX.def文件.输入一下内容,保存后添加到项目之中.
LIBRARY PSProjectXX
DESCRIPTION 'Sample custom interface marshaler'
EXPORTS
DllGetClassObject PRIVATE
DllCanUnloadNow PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE

4. 打开project->setting,然后选择您的项目,单击c + + 选项卡并添加到预处理器定义字段的值REGISTER_PROXY_DLL以及_win32_winnt=0x400;
在link选项卡的Genernal->Object/library modules栏中添加一下类库:rpcndr.lib rpcns4.lib rpcrt4.lib


5. 在项目属性 (或设置) 的自定义生成步骤部分中键入下列值,然后关闭生成设置对话框:
Description:
Registering Custom Interface Marshaler

Build Command(s):
regsvr32 /s /c "$(TargetPath)"
echo regsvr32 exe. time > "$(OutDir)\regsvr32.trg"

Output File(s):
$(OutDir)\regsvr32.trg
6.编译,搞定.

需要代码的话,老规矩,留下email
WaistCoat13 2009-11-03
  • 打赏
  • 举报
回复
否则,客户端得通过代理存根DLL来调用服务器的对象方法。
WaistCoat13 2009-11-03
  • 打赏
  • 举报
回复
如果你服务器里创建是双接口的对象的话,不需要做出了,COM通过系统的RPC直接帮你调用了。
xuxian02092213 2009-11-03
  • 打赏
  • 举报
回复
注册是看明白了,但是还是有不明白的地方,比如函数过程该如何去实现,仅仅有些接口以及实现在那,当客户端调用接口时,服务器端不需要做任何动作吗?
xuxian02092213 2009-11-03
  • 打赏
  • 举报
回复
接口的cpp文件
#include "stdafx.h"
#include "Chapter4_Server.h"
#include "Math.h"

/////////////////////////////////////////////////////////////////////////////
// CMath

STDMETHODIMP CMath::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_IMath,
};
for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}

STDMETHODIMP CMath::Add(long lOp1, long lOp2, long * plResult)
{
*plResult = lOp1 + lOp2;
return S_OK;
}

STDMETHODIMP CMath::Subtract(long lOp1, long lOp2, long * plResult)
{
*plResult = lOp1 - lOp2;
return S_OK;
}

STDMETHODIMP CMath::Multiply(long lOp1, long lOp2, long * plResult)
{
*plResult = lOp1 * lOp2;
return S_OK;
}

STDMETHODIMP CMath::Divide(long lOp1, long lOp2, long * plResult)
{
// Handle divide-by-zero error
if ( lOp2 == 0 )
{
return Error( "Divide by zero attemped" );
}

*plResult = lOp1 / lOp2;
return S_OK;
}

// New IMath2 methods
STDMETHODIMP CMath::Sum( short sArraySize,
short sArray[],
long* lResult )
{
*lResult = 0;
while( sArraySize )
{
*lResult += sArray[--sArraySize];
}

return S_OK;
}

STDMETHODIMP CMath::Compute( mathOPERATION enumOp,
long lOp1,
long lOp2,
long * plResult)
{
switch( enumOp )
{
case mathAdd:
return Add( lOp1, lOp2, plResult );
case mathSubtract:
return Subtract( lOp1, lOp2, plResult );
case mathMultiply:
return Multiply( lOp1, lOp2, plResult );
case mathDivide:
return Divide( lOp1, lOp2, plResult );
}
return S_OK;
}

STDMETHODIMP CMath::get_AdvancedMath(IAdvancedMath** pVal)
{
GetUnknown()->QueryInterface( IID_IAdvancedMath, (void**) pVal);
return S_OK;
}

// IAdvancedMath interface
long calcFactorial( short n )
{
if ( n > 1 )
return n * calcFactorial( n - 1 );
else
return 1;
}

STDMETHODIMP CMath::Factorial( short sOp, long* pResult )
{
*pResult = calcFactorial( sOp );
return S_OK;
}

long calcFibonacci( short n )
{
if ( n <= 1 )
return 1;

return calcFibonacci( n - 1 ) + calcFibonacci( n - 2 );
}

STDMETHODIMP CMath::Fibonacci( short sOp, long* pResult )
{
*pResult = calcFibonacci( sOp );
return S_OK;
}

STDMETHODIMP CMath::get_Info( COMPONENT_INFO** ppInfo )
{
*ppInfo = (COMPONENT_INFO *) CoTaskMemAlloc( sizeof( COMPONENT_INFO ));
ZeroMemory( *ppInfo, sizeof( COMPONENT_INFO ));

// Make these globals or defines
(*ppInfo)->sMajor = 1;
(*ppInfo)->sMinor = 0;

char szBuffer[128];
if ( LoadString( _Module.GetResourceInstance(),
IDS_AUTHOR,
szBuffer,
sizeof( szBuffer ) ))
{
(*ppInfo)->pstrAuthor = (unsigned char*) CoTaskMemAlloc( lstrlen( szBuffer ) + 1 );
memcpy( (*ppInfo)->pstrAuthor, szBuffer, lstrlen( szBuffer ) + 1 );
}

if ( LoadString( _Module.GetResourceInstance(),
IDS_NAME,
szBuffer,
sizeof( szBuffer ) ))
{
USES_CONVERSION;
(*ppInfo)->bstrName = SysAllocString( A2W( szBuffer ));
}

return S_OK;
}

STDMETHODIMP CMath::get_Name( BSTR* pbstrName )
{
char szBuffer[128];
if ( LoadString( _Module.GetResourceInstance(),
IDS_NAME,
szBuffer,
sizeof( szBuffer ) ))
{
USES_CONVERSION;
*pbstrName = SysAllocString( A2W( szBuffer ));
}

return S_OK;
}

加载更多回复(7)

3,245

社区成员

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

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