在.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)个字符的值设为0 memset(tmpstr,0,sizeof(tmpstr)); memset(tmpbyte,0,sizeof(tmpbyte)); //获得键的地址tempstr strcpy(tmpstr,SP_REG_PATH); strcat(tmpstr,LOGICALNAME); //打开键并获取该键句柄的指针pKey,调试成功时hkep的值为ERROR_SUCCESS hkey = RegOpenKeyEx(HKEY_LOCAL_MACHINE,tmpstr,0,KEY_READ,&pKey);
已经获得键的句柄,接下来读取注册表中的数据:
//如同上面提到的,如果打开键成功hkey就会等于ERROR_SUCCESS if (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()了。