通过注册表使用动态库

在.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()了。

猜你喜欢

转载自blog.csdn.net/q8547957/article/details/20134445