通过注册表使用动态库

来源:互联网 发布:python web监控系统 编辑:程序博客网 时间:2024/05/09 02:12

在.h文件的声明:

//两个宏指明了注册表中键所在的位置#define SP_REG_PATH  "SOFTWARE\\XFS\\SERVICE_PROVIDERS\\"#define LOGICALNAME "TisReceiptPrinter"//为指向动态库中函数指针定义指针类别名,用于声明该类型的指针typedef int(__stdcall * PPrtReset) (void) ;typedef int(__stdcall * PPrtPrint) (char * Buffer) ;

在.cpp文件函数外的声明(本来这部分定义应该在.h文件中的,可是不知道为什么放在.h文件中会发生多重定义的错误,有人知道的话请不吝指教):

//用于获得DLL文件路径名而用到的函数,以及一个获得DLL的句柄char gDLL_NAME[255] ;  char gLogFile[255];   HINSTANCE handledll; //声明动态库中函数的指针PPrtReset m_pPrtReset;PPrtPrint m_pPrtPrint;

接下来的要做的就是在读取注册表,主要用于获得动态库的地址;

在函数内,先获得注册表中指定的键:

long hkey;char tmpstr[256];BYTE tmpbyte[256];HKEY pKey;DWORD tmpdw,tmplen;//memset函数的作用就是将已申请的的空间tmpstr的首sizeof(tmpstr)个字符的值设为0memset(tmpstr,0,sizeof(tmpstr));memset(tmpbyte,0,sizeof(tmpbyte));//获得键的地址tempstrstrcpy(tmpstr,SP_REG_PATH);strcat(tmpstr,LOGICALNAME);//打开键并获取该键句柄的指针pKey,调试成功时hkep的值为ERROR_SUCCESShkey = RegOpenKeyEx(HKEY_LOCAL_MACHINE,tmpstr,0,KEY_READ,&pKey);

已经获得键的句柄,接下来读取注册表中的数据:

//如同上面提到的,如果打开键成功hkey就会等于ERROR_SUCCESSif (hkey == ERROR_SUCCESS){//获得动态库句柄handledll = LoadLibrary(gDLL_NAME);if (handledll==NULL){return -1;}//获取动态库中的函数m_pPrtReset  = (PPrtReset)GetProcAddress(handledll,"PrtReset");m_pPrtPrint  = (PPrtPrint)GetProcAddress(handledll,"PrtPrint");tmplen = 255;//从注册表中获取动态库所在的路径,此时tembyte的值就是动态库所在的路径hkey = RegQueryValueEx(pKey,"WorkPath",NULL,&tmpdw,tmpbyte,&tmplen);//如果获得动态库路径成功if (hkey == ERROR_SUCCESS){//依然是初始化空间memset(gDLL_NAME,0,sizeof(gDLL_NAME));memset(gLogFile,0,sizeof(gLogFile));//通过路径和动态库名获得动态库memcpy(gDLL_NAME,tmpbyte,tmplen);strcat(gDLL_NAME,"TisReceipt.dll");}//释放注册表的句柄RegCloseKey(pKey);}

以上部分,是使用注册表获得动态库路径的过程,接下来就可以开始使用动态库了:

//这里是通过显示方法调用dll中的函数//加载动态连接口handledll = LoadLibrary(gDLL_NAME);//如果句柄为空,说明获取动态库失败if (handledll==NULL){return -1;}//获取动态库中的函数m_pPrtReset  = (PPrtReset)GetProcAddress(handledll,"PrtReset");m_pPrtPrint  = (PPrtPrint)GetProcAddress(handledll,"PrtPrint");

之后就可以使用动态库中的函数m_pPrtReset()和m_pPrtPrint()了。
0 0
原创粉丝点击