如何判断一个陌生的DLL是否注册了? ( 积分: 200 )

  • 主题发起人 主题发起人 man8888
  • 开始时间 开始时间
M

man8888

Unregistered / Unconfirmed
GUEST, unregistred user!
很多人说用CreateCOMObject的方法创建对象,如果成功了算注册了,但是我现在连PROGID,CLASSID都不知道,还有人说用Regsvr32.exe进行注册等等,我不是问如何注册,是如何判断是否注册,我就光知道一个abc.dll文件名,别的什么都不知道,能判断么???

CreateCOMObject方法判断的代码如下:
uses ComObj, ActiveX;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
clsID: TGUID;
obj: IUnknown;
begin
CLSIDFromProgID('test.test', clsID);
obj:= CreateCOMObject(clsID);
if obj <> nil then
ShowMessage('registered')
else
ShowMessage('not registered');
end;
 
帮你顶,接个分
 
没有这样的接口
如果一定要判断...那只有枚举HKEY_CLASSES_ROOT/CLSID下所有子键值了,太多了效率低下
 
ysai说的对,遍历注册表HKEY_CLASSES_ROOT/CLSID下所有子键值太慢了,而且我又不知道ProgID是'test.test',我怎么知道是否注册了呢?
 
delphi可以自动注册dll的,你可以在程序做处理,自动注册!
 
你没看懂我的问题:
“如何判断一个陌生的DLL是否注册了? ”,不是说如何注册。
 
我想,这个问题可以这样理解。
如果你不知道该dll的ProgID和 clsID,那么显然你无法作为com或者ole来调用它。那么不管它注册与否你都用不上。
如果仅仅调用dll内的函数,那么通常这类dll是不用注册的。

如果一定要知道某个dll是否注册,觉得用虚拟机做比较理想:
需要注册的dll都会导出这么一个函数 DllRegisterServer
你loadlib,然后虚拟执行这个函数,它会写入一个guid,然后在注册表内查找此id,没找到就说明没注册。
 
虚拟机?晕....
还不如HOOK本进程写注册表的几个函数(RegCreateKey,RegCreateKeyEx,RegSetValue,RegSetValueEx),然后LoadLibrary,调用DllRegisterServer,然后看它在HKEY_CLASSES_ROOT/CLSID下写了什么,HOOK代码直接返回而不实际写注册表,这样就能得到它的ClassID,ProgID等信息,再去读当前注册表是否存在这些Key,如果存在就是已经注册了
 
哦?玩钩子,这想法可行,但是有点怕。。。
恐怕也只能通过DllRegisterServer函数判断这个问题了。
 
我是用这个办法检测ADO是否注册。
{=================================================================
功 能: 检测ADO2.8驱动是否存在
返回值: True/False
=================================================================}
function CheckADO28Exists: boolean;
var
ADODB: Variant;
begin
try
ADODB := CreateOleObject('ADODB.Connection.2.80');
result := True;
except
result := False;
end;
end;
根据上面的方法可以修改为你的对象。
 
但是我不知道这个DLL的对象名是'ADODB.Connection.2.80'!
我只知道这个DLL是个可注册的DLL,你的函数没法判断对象名是什么啊!
 
不明白,不是COM就不用注册DLL,为什么非要注册呢?用程序调用就成了
如果是是COM,那就用注册表查找CLSID下每一个键的InprocServer32下的@值里包不包括abc.dll就行了,找到了就是这个键,找不到就是没有注册!
 
遍历整个注册表太慢,我想做个判断安装程序安装过程中都注册哪些dll的程序,所以我不知道progID,classID,我只知道dll文件名。
 
昨天看了TDump,发现能找到DLL里面的函数等详细内容,它不知道用什么方法得到的。我看得到ProgID、GUID有可能。
 
调用一下这个 dll,就知道是否注册了.
 
如果调用DllRegisterServer那么就把dll注册了!我不希望无缘无故注册个dll,我只想判断,不想随便注册,说不定这个dll是个木马呢!
 
期待一个解决办法。
 
1。挂钩子,忽略指定进程对注册表的写入并记录下来
详细代码见此:http://www.delphibbs.com/delphibbs/dispq.asp?LID=2957549

2。载入目标dll,并调用DllRegisterServer过程
3。卸载钩子
4。用记录下的信息查找注册表,即可判断此dll是否注册。
 
思路不错,就是不会用钩子。。。
谁给写个函数?[:(]
 
uses
ComServ, ActiveX;

//根据类型库遍历出DLL中所有COCLASS的GUID,然后到注册表中看看有没有注册
Function ComHasRegisted(ComDLLName : String):Boolean;
var
TL : ITypeLib;
TypeInfo : ITypeInfo;
I:Integer;
ptypeAttrib : PTypeAttr;
typeAttrib : TYPEATTR;
KeyName : String;
ClassKey : HKEY;
begin
Result := False;
TL := LoadTypeLibrary(ComDLLName);
if TL = nil then
Exit;
for I := 0 to TL.GetTypeInfoCount - 1 do
begin
TL.GetTypeInfo(I, TypeInfo);
TypeInfo.GetTypeAttr(ptypeAttrib);
typeAttrib := ptypeAttrib^;
TypeInfo.ReleaseTypeAttr(ptypeAttrib);

if typeAttrib.typekind = TKIND_COCLASS then
begin
KeyName := 'CLSID/' + GUIDToString(typeAttrib.guid);
if RegOpenKey(HKEY_CLASSES_ROOT,
PChar(KeyName),
ClassKey) = ERROR_SUCCESS then
begin
Result := True;
Exit;
end;
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
//
if not OpenDialog1.Execute() then
Exit;
if ComHasRegisted(OpenDialog1.FileName) then
begin
ShowMessage('注册了');
end;

end;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
626
import
I
后退
顶部