WIN32 DLL动态链接库第2例
下面写一个用DLL访问注册表的程序:
步骤如下:
<1> : 新建一个DLL 工程:程序如下:
#include<afx.h>
#include"dll5.h"
_declspec(dllexport) void _stdcall WriteToWinfile(LPCTSTR appname,LPCTSTR keyname,LPCTSTR str){
WriteProfileString(appname,keyname,str);
}
_declspec(dllexport) void _stdcall ReadFromWinFile(LPCTSTR appname,LPCTSTR keyname,LPCTSTR def,char* retstr,DWORD nsize){
GetProfileString(appname,keyname,def,retstr,100);
MessageBox(NULL,retstr,"read info",MB_OK);
}
_declspec(dllexport) void _stdcall WriteRegPara(LPCTSTR lpData,DWORD cbData){
HKEY m_Hkey;
RegCreatePara(HKEY_CURRENT_USER,"Software\\www.google.com\\admin",&m_Hkey);
RegSetValue(m_Hkey,NULL,REG_SZ,lpData,cbData);
//RegClosePara(m_Hkey);
}
_declspec(dllexport) void _stdcall ReadRegPara(DWORD cbData){
HKEY m_Hkey;
LONG lvalue;
//RegCreatePara(HKEY_CURRENT_USER,"Software\\www.google.com\\admin",&m_Hkey);
RegQueryValue(HKEY_CURRENT_USER,"Software\\www.google.com\\admin",NULL,&lvalue);
char *pBuf=new char[lvalue];
RegQueryValue(HKEY_CURRENT_USER,"Software\\www.google.com\\admin",pBuf,&lvalue);
RegClosePara(m_Hkey);
MessageBox(NULL,pBuf,"read reg",MB_OK);
}
<2> : 其中”dll5.h”文件中程序如下:
#ifndef DEF_REG
#define DEF_REG
void RegCreatePara(HKEY hKey,LPCTSTR lpSubKey,PHKEY phkResult){
RegCreateKey(hKey,lpSubKey,phkResult);
}
void RegOpenPara(HKEY hKey,LPCTSTR lpSubKey,PHKEY phkResult){
RegOpenKey(hKey,lpSubKey,phkResult);
}
void RegClosePara(HKEY hKey){
RegCloseKey(hKey);
}
#endif
<3> 其中def文件的编码如下:
LIBRARY
EXPORTS
WriteToWinfile @1
ReadFromWinFile @2
WriteRegPara @3
ReadRegPara @4
<4> 编译dll工程,再将dll库文件放到新建的工程中,新建工程的程序如下:
#include<iostream>
#include<windows.h>
using namespace std;
void main(){
char retstr[100];
HINSTANCE hInst;
hInst=LoadLibrary("dll5.dll");
typedef void (_stdcall *ADDPROC)(LPCTSTR appname,LPCTSTR keyname,LPCTSTR str);
ADDPROC WriteToWin=(ADDPROC)GetProcAddress(hInst,"WriteToWinfile");
if(!WriteToWin){
return;
}
WriteToWin("warden","nickname","www.google.com");
/*---
char ip[16];
DWORD num=0;
num=GetProfileString("warden","nickname","def",ip,16);
cout<<num<<endl<<ip<<endl;
---*/
/*----
GetProfileString("warden","nickname","liis",retstr,100);
MessageBox(NULL,retstr,"read info",MB_OK);
----*/
typedef void (_stdcall *ADDPROCD)(LPCTSTR appname,LPCTSTR keyname,LPCTSTR def,LPCTSTR retstr,DWORD nsize);
ADDPROCD ReadFromWin=(ADDPROCD)GetProcAddress(hInst,"ReadFromWinFile");
if(!ReadFromWin){
return;
}
ReadFromWin("warden","nickname","lisi",retstr,100);
MessageBox(NULL,retstr,"read info",MB_OK);
typedef void(_stdcall * ADDPROE)(LPCTSTR lpData,DWORD cbData);
ADDPROE Setregvalue=(ADDPROE)GetProcAddress(hInst,"WriteRegPara");
if(!Setregvalue){
MessageBox(NULL,"error infor","error",MB_OK);
return ;
}
Setregvalue("warden",20);
typedef void(_stdcall *ADDPROCF)(DWORD lpData);
ADDPROCF ReadRegvalue=(ADDPROCF)GetProcAddress(hInst,"ReadRegPara");
if(!ReadRegvalue){
MessageBox(NULL,"error infor","error",MB_OK);
return ;
}
ReadRegvalue(100);
FreeLibrary(hInst);
}
编译无错误!
<5> : 运行程序,就会可以看到结果了!

浙公网安备 33010602011771号