利用RegSvr32来注册.NET COM组件
背景
前一段时间由于业务关系须要在一个比较旧的系统编写一个补丁。原系统使用VB编程但如果要使用VB来实现这个补丁的内容对于我这个并不怎么接触VB的人来说太头痛了。由于平时使用的是C#来开发于是便想到能否用编写.NETCOM组件的方式来让VB调用。想到这两三下便写了个.NETCOM测试组件用VB测试调用测试OK。接下来就是进行后续的开发可等到开发完成后到了补丁打包环节却傻眼了。原来的补丁打包工具在诞生时还不知道.NET为何物所以根本没有使用RegAsm来注册.NET COM组件的功能。现在更改打补丁工具那是不现实的可要使得VB调用.NET COM又必须使用RegAsm注册这下怎么办呢
解决方式
原打包工具是支持使用Reg Svr32来注册Co m组件的忽然想到能否使用Reg Svr32来注册.N ETCOM组件呢印象中regsvr32在注册DLL的时候会有个Cal lBack函数的于是赶紧Google找找相关资料最终解决了这个问题。主要原理是写一个代理的dl l 在这个DLL的注册响应函数Dl lRegisterServer里调用RegAsm来注册.NET COM 同理在Dl lUnregisterServer里反注册。
代理DLL代码stdafx.h
#pragma once
#include <windows.h>
#include <tchar.h>
Reg iste r.cpp
/*----------------------------------------------
此组件主要解决C#编写的COM组件无法用RegSvr32注册的问题
原理是增加一个代理DLL在代理DLL注册时 响应DllRegisterServer注册函数
在响应函数中使用RegAsm来注册.Net Com组件反注册同理。
----------------------------------------------*/
#include "stdafx.h"
#define MAX_PATH 260
//全局变量存放注册代理dll路劲
TCHAR g_FilePath[MAX_PATH] ;
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
//记录代理DLL的路径主要是为了方便后面获取代理DLL所在目录
GetModuleFileName(hModule, g_FilePath, 255) ;
switch (ul_reason_for_call)
{case DLL_PROCESS_ATTACH:case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;
}return TRUE;
}
//注册响应函数extern "C" _declspec(dllexport) long DllRegisterServer(void)
{return Register(TRUE) ;
}
//反注册响应函数extern "C" _declspec(dllexport) long DllUnregisterServer(void)
{return Register(FALSE) ;
}
//注册组件
//install : TRUE for install, FALSE for unstall
BOOL Register(BOOL install) {
TCHAR cmd[MAX_PATH] ;
PROCESS_INFORMATION processInfo;
STARTUPINFO stInfo;
//获取注册命令
GetCmdLine(cmd, install) ;
ZeroMemory( &processInfo, sizeof(processInfo) ) ;
ZeroMemory( &stInfo, sizeof(stInfo) ) ;stInfo.cb = sizeof(stInfo) ;
BOOL ret;
//创建注册进程ret =
CreateProcess(NULL,cmd,NULL,NULL,FALSE,CREATE_NO_WINDOW,NULL,NULL,&stInfo,&processInfo) ;if(ret==TRUE) {
CloseHandle(processInfo.hProcess) ;
CloseHandle(processInfo.hThread) ;return TRUE;
}else{
//DWORD error = GetLastError() ;return FALSE;
}return FALSE;
}
//获取注册命令加/s开关可以免除确认步骤。
//注册 RegAsm.exe /s Test.dll
//反注册 RegAsm.exe /s /u Test.dllvoid GetCmdLine(LPTSTR cmd, BOOL install) {
TCHAR regAsmPath[MAX_PATH] ;
TCHAR regDl lPath[MAX_PATH] ;
TCHAR temp[10] ;regAsmPath[0] = ' \0' ;regDllPath[0] = ' \0' ;temp[0] = ' \0' ;
GetRegAsmPath(regAsmPath) ; //获取RegAsm.exe程序绝对路径
GetRegDllPath(regDllPath) ; //获取需要注册的.NET COM组件绝对路径if(install) {lstrcpy(temp, _T(" /s ") ) ;
}else{lstrcpy(temp, _T(" /s /u ") ) ;
}cmd[0] = ' \0' ;lstrcat(cmd, regAsmPath) ;lstrcat(cmd, temp) ;lstrcat(cmd, regDllPath) ;
}
//获取需要注册.Net Com组件路径此处写死为Test.dll与代理dll在同一个目录//后期可以改成读取ini配置文件void GetRegDllPath(LPTSTR path) {int count = 0;for(int i=0; i < MAX_PATH; i++) {if(g_FilePath[i] == _T('\\' ) ) {count = i + 2;
}
}
TCHAR temp[MAX_PATH] ;lstrcpyn(temp, g_FilePath, count) ; //代理DLL所在目录lstrcat (path, _T("\"") ) ;lstrcat (path, temp) ;lstrcat (path, _T("Test.dll\"") ) ;
}
//获取.NET COM注册程序RegAsm. exe的路径
//方法读取[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\Instal lRoot]的值//然后拼接上"v2.0.50727\RegAsm. exe"void GetRegAsmPath(LPTSTR path) {
HKEY hKey;
DWORD dwBufLen = MAX_PATH;
LONG lRet;lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\Microsoft\\.NETFramework") ,0,KEY_READ, &hKey) ;lRet = RegQueryValueEx(hKey, _T("InstallRoot") , NULL, NULL, (LPBYTE)path, &dwBufLen) ;RegCloseKey(hKey) ;lstrcat(path, _T("v2.0. 50727\\RegAsm.exe") ) ;
}
搬瓦工最近上线了一个新的荷兰机房,荷兰 EUNL_9 机房,这个 9 的编号感觉也挺随性的,之前的荷兰机房编号是 EUNL_3。这次荷兰新机房 EUNL_9 采用联通 AS9929 高端路线,三网都接入了 AS9929,对于联通用户来说是个好消息,又多了一个选择。对于其他用户可能还是 CN2 GIA 机房更合适一些。其实对于联通用户,这个荷兰机房也是比较远的,相比之下日本软银 JPOS_1 机房可...
CloudCone商家在前面的文章中也有多次介绍,他们家的VPS主机还是蛮有特点的,和我们熟悉的DO、Linode、VuLTR商家很相似可以采用小时时间计费,如果我们不满意且不需要可以删除机器,这样就不扣费,如果希望用的时候再开通。唯独比较吐槽的就是他们家的产品太过于单一,一来是只有云服务器,而且是机房就唯一的MC机房。CloudCone 这次四周年促销活动期间,商家有新增独立服务器业务。同样的C...
看到群里网友们在讨论由于不清楚的原因,有同学的网站无法访问。他的网站是没有用HTTPS的,直接访问他的HTTP是无法访问的,通过PING测试可以看到解析地址已经比较乱,应该是所谓的DNS污染。其中有网友提到采用HTTPS加密证书试试。因为HTTP和HTTPS走的不是一个端口,之前有网友这样测试过是可以缓解这样的问题。这样通过将网站绑定设置HTTPS之后,是可以打开的,看来网站的80端口出现问题,而...