代理存根DLL的创建的步骤:
1. 通过MIDL编译器自动生成 projectXX.h,dlldata.c,projectXX_i.c,projectXX_p.c文件.
我使用的命令:midl /h iface.h /iid guids.c /proxy proxy.c server.idl
2. 在vs2008下创建一个空的动态链接库工程,把用midl编译器生成的iface.h、guids.c、proxy.c、dlldata.c文件添加到工程中
3. 添加一个proxy.def文件,在文件中添加如下类容:
LIBRARY proxy.dll
DESCRIPTION 'Proxy/Stub DLL'
EXPORTS
DllGetClassObject PRIVATE
DllCanUnloadNow PRIVATE
GetProxyDllInfo PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
4. 对项目工程的属性进行设置:
在C/C++条目中,选中预处理器,在预处理器定义中添加REGISTER_PROXY_DLL
在链接器条目中,选中输入, 在附加依赖选项中添加 rpcrt4.lib
然后开始编译,编译通过之后,我用regsvr32 proxy.dll来注册dll,总是提示:
模块“prox.dll”已经,但找不到入口点DllRegisterServer......
开始我以为是DllRegisterServer没有定义,导致的问题,我有仔细的看了一下dlldata.c文件,文件里有有一段断码确实定义了
DLLDATA_ROUTINES( aProxyFileList, GET_DLL_CLSID )
DLLDATA_ROUTINES宏是在rpcproxy.h中定义的,这个宏定义的最后又使用了另外一个宏DLLREGISTRY_ROUTINES,定义如下
#define DLLREGISTRY_ROUTINES(pProxyFileList,pClsID ) REGISTER_PROXY_DLL_ROUTINES(pProxyFileList,pClsID )
宏REGISTER_PROXY_DLL_ROUTINES定义了三个函数DLLMAIN_ENTRY、DLLREGISTERSERVER_ENTRY和
DLLUNREGISTERSERVER_ENTRY刚好和上面proxy.def文件中导出的注册和注销函数对应。
在网上找了半天发现一个细节问题漏掉了,要在项目属性链接器->输入->模块定义文件中指定模块定义文件proxy.def,
然后重新编译之后,在用regsvr32 proxy.dll来注册dll就不会出现错误提示了
貌似以前用vc6.0创建dll的时候,直接将.def文件添加到工程中就可以了。