Vista下如何操作注册表 ( 积分: 20 )

哈哈sy0116老兄你也太牛了啊,呵呵,其实你的想法很好的,不过实施起来很有难度的。还有你说的那个manifest有效,不知道怎么在我这边不可以的啊。 呵呵
 
关于多次点击会出错的问题我也不清楚了,我稍微改了一下代码,把第一句改成<br>GetMem(info,32);发现点击17次就出错,而按原来的写法点击11次就出错,改成GetMem(info,128);或GetMem(info,256);后就没出错了,我一直按着回车键几分钟也没出错,具体原因请高手解释
 
注入的方法应该很难搞定了,我试了一个简单的:<br>先启动regedit.exe,然后用HOOK钩它,结果根本挂不上,用Spy++也看不到她的任何消息<br>还是用CodeGear给出的办法最简单
 
to&nbsp;zzyun,是哪个键?我帮你测试一下看看。<br>to&nbsp;sy0116&nbsp;请问你的manifest文件怎么写的?能不能贴一下,怎么我写的无论是编译进exe还是同名加.manifest和exe放在一起都不起作用?
 
to:域<br>不是测试哪个键吧,我要求的是操作VISTA的注册表来得到PC的CPU名字。
 
对了,manifest文件的问题已经解决了,原来我编译时没有让d7&nbsp;run&nbsp;as&nbsp;administrator,低级错误,汗...
 
to:各位仁兄<br>该问题解决了,也该结帖了,只有20分希望各位谅解。呵呵<br>sy0116兄的那个问题如有人能解决,本人将另开窗口派分啊。&nbsp;呵呵。
 
多人接受答案了。
 
to&nbsp;sy0116:<br>你好象没有FreeMem吧?这样多次点击后缓冲溢出,肯定要出错
 
to&nbsp;域:<br>function&nbsp;getcpu:pChar;stdcall;<br>var<br>&nbsp;&nbsp;reg:HKEY;<br>&nbsp;&nbsp;size:pDWORD;<br>&nbsp;&nbsp;info:pByte;<br>begin<br>&nbsp;&nbsp;GetMem(info,256);<br>&nbsp;&nbsp;GetMem(size,SizeOf(pdword));<br>&nbsp;&nbsp;size^:=64;<br>&nbsp;&nbsp;RegOpenKeyEx(HKEY_LOCAL_MACHINE,PChar('HARDWARE/DESCRIPTION/System/CentralProcessor/0'),0,KEY_QUERY_VALUE,reg);<br>&nbsp;&nbsp;RegQueryValueEx(reg,PChar('ProcessorNameString'),nil,nil,Pbyte(info),@Size);<br>&nbsp;&nbsp;Result:=PChar(info);<br>&nbsp;&nbsp;RegCloseKey(reg);<br>end;<br><br>procedure&nbsp;TForm1.Button1Click(Sender:&nbsp;TObject);<br>begin<br>&nbsp;&nbsp;ShowMessage(getcpu);<br>end;&nbsp;&nbsp;<br><br>我们不停的点Button,试了大楷2分钟左右也没报什么错的。你认为可能会益出,那应该怎么改?呵呵
 
看了一下&nbsp;sy0116的代码,确实没有释放内存。<br>不过,没释放内存应该不会马上出错,只会导致内存泄露,累计后出现内存不足错误。<br><br>我估计sy0116的错误可能是由于申请的内存过小,拷贝进来的数据超出,导致内存溢出引起错误。
 
to:ufo!<br>我和sy0116也讨论过,也怀疑是因为这个原因导致的。将以前的64改为了256后我们试了几分钟都没报错的,如果按照你的说法来看,长时间使用还是会报错的?<br>给我的感觉是这个释放内存不是很好加进去的。呵呵
 
改成这样看看:<br>var<br>&nbsp;&nbsp;reg:HKEY;<br>&nbsp;&nbsp;size:integer;<br>&nbsp;&nbsp;info:AnsiString;<br>begin<br>&nbsp;&nbsp;size:=MAX_PATH;<br>&nbsp;&nbsp;SetLength(info,MAX_PATH+1);&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;RegOpenKeyEx(HKEY_LOCAL_MACHINE,PChar('HARDWARE/DESCRIPTION/System/CentralProcessor/0'),0,KEY_QUERY_VALUE,reg);<br>&nbsp;&nbsp;RegQueryValueEx(reg,PChar('ProcessorNameString'),nil,nil,Pbyte(info),@Size);<br>&nbsp;&nbsp;Result:=copy(info,1,size-1);<br>&nbsp;&nbsp;RegCloseKey(reg);<br>end;
 
getmem和freemem要配套使用,否则会导致内存泄漏。<br>AnsiString类型的内存分配和释放会由delphi的内存管理器负责。
 
to&nbsp;ufo!:<br>你的那段代码我刚才测试了一下是可以的。<br><br>你所说的getmem和freemem要配套使用,我在sy0116的代码中测试了一下好象还是有点问题的。<br>function&nbsp;getcpu:pChar;stdcall;<br>var<br>&nbsp;&nbsp;reg:HKEY;<br>&nbsp;&nbsp;size:pDWORD;<br>&nbsp;&nbsp;info:pByte;<br>begin<br>&nbsp;&nbsp;GetMem(info,64);<br>&nbsp;&nbsp;GetMem(size,SizeOf(pdword));<br>&nbsp;&nbsp;size^:=64;<br>&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;RegOpenKeyEx(HKEY_LOCAL_MACHINE,PChar('HARDWARE/DESCRIPTION/System/CentralProcessor/0'),0,KEY_QUERY_VALUE,reg);<br>&nbsp;&nbsp;&nbsp;&nbsp;RegQueryValueEx(reg,PChar('ProcessorNameString'),nil,nil,Pbyte(info),@Size);<br>&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;freemem(size);<br>&nbsp;&nbsp;&nbsp;&nbsp;freemem(info);<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;Result:=PChar(info);<br>&nbsp;&nbsp;RegCloseKey(reg);<br>end;<br><br>procedure&nbsp;TForm1.Button1Click(Sender:&nbsp;TObject);<br>begin<br>&nbsp;&nbsp;showmessage(getcpu);<br>end;<br><br>end.
 
你如果不需要在dll里面用,那么就用我修改的代码吧,函数直接返回string类型就可以了。<br>sy0116的代码<br>&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;freemem(size);<br>&nbsp;&nbsp;&nbsp;&nbsp;freemem(info);&nbsp;//此处已经释放了内存<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;Result:=PChar(info);&nbsp;//再调用已经释放的内存,出错<br>&nbsp;&nbsp;RegCloseKey(reg);<br><br>如果你要在dll内使用,试试这样:<br>function&nbsp;getcpu:pChar;stdcall;<br>var<br>&nbsp;&nbsp;reg:HKEY;<br>&nbsp;&nbsp;size:integer;<br>&nbsp;&nbsp;info:pByte;<br>begin<br>&nbsp;&nbsp;GetMem(info,256);<br>&nbsp;&nbsp;size:=256;<br>&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;RegOpenKeyEx(HKEY_LOCAL_MACHINE,PChar('HARDWARE/DESCRIPTION/System/CentralProcessor/0'),0,KEY_QUERY_VALUE,reg);<br>&nbsp;&nbsp;&nbsp;&nbsp;RegQueryValueEx(reg,PChar('ProcessorNameString'),nil,nil,Pbyte(info),@Size);<br>&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;//freemem(size);<br>&nbsp;&nbsp;&nbsp;&nbsp;//freemem(info);<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;Result:=PChar(info);<br>&nbsp;&nbsp;RegCloseKey(reg);<br>end;<br><br>procedure&nbsp;TForm1.Button1Click(Sender:&nbsp;TObject);<br>var&nbsp;ss:&nbsp;pchar;<br>begin<br>&nbsp;ss:=&nbsp;getcpu;<br>showmessage(ss);<br>&nbsp;freemem(ss);<br>&nbsp;&nbsp;<br>end;
 
另外还有一个常用方法,就是在主程序中申请内存,然后把指针和size作为参数传入dll,调用dll内的函数后释放申请的内存。<br>呵呵,一个简单的例子,就是你调用RegQueryValueEx函数的方式,就需要你预先申请内存,调用函数后再释放内存。<br>同样的,你可以把这个申请内存和释放内存的操作放到主程序中做。然后getcpu改成这个类型<br>getcpu(info:&nbsp;PByte;size:integer):boolean;
 
呵呵,老兄们,你们都好牛啊。
 
procedure&nbsp;TCtrlFrm.Button4Click(Sender:&nbsp;TObject);<br>var<br>&nbsp;&nbsp;i:&nbsp;integer;<br>&nbsp;&nbsp;lphkey:Hkey;<br>&nbsp;&nbsp;sKeyName:String;<br>&nbsp;&nbsp;sKeyValue:String;<br>&nbsp;&nbsp;sValue:String;<br>begin<br>&nbsp;&nbsp;sKeyName:='software/nike/0';<br>&nbsp;&nbsp;sValue:=Application.ExeName;<br>&nbsp;&nbsp;RegCreateKey(HKey_Local_Machine,PChar(sKeyName),lphkey);<br>&nbsp;&nbsp;RegOpenKeyEx(HKEY_LOCAL_MACHINE,PChar(sKeyName),0,KEY_WRITE,lphkey);<br>&nbsp;&nbsp;i:=&nbsp;RegSetValueEx(lphkey,'Exepath',0,reg_sz,PChar(sValue),length(sValue));<br>&nbsp;&nbsp;showmessage(inttostr(i));<br>end;<br>用这种方法居然写不到VISTA的注册表中,还请各位新朋老友帮忙看看咯。
 

Similar threads

回复
0
查看
855
不得闲
S
回复
0
查看
738
SUNSTONE的Delphi笔记
S
S
回复
0
查看
617
SUNSTONE的Delphi笔记
S
顶部