我有一个我在我的程序中加载的DLL,它读取并将其设置写入注册表(hkcu)。我的程序在加载dll之前更改了这些设置,因此它使用我的程序希望它使用的设置,工作正常。
不幸的是,我需要使用dll的不同设置运行我的程序的多个实例。现在我到目前为止使用的方法不再可靠,因为程序的一个实例可能会覆盖另一个实例刚刚在dll有机会读取之前编写的设置。
我没有得到有问题的dll的来源,我不能要求编写它的程序员改变它。
我的一个想法是挂钩注册表访问函数并将它们重定向到注册表的另一个分支,该分支特定于我的程序实例(例如,使用进程ID作为路径的一部分)。我认为这应该有用,但也许你有一个不同/更优雅。
如果重要:我使用Delphi 2007作为我的程序,dll可能是用C或C ++编写的。
答案 0 :(得分:4)
作为API挂钩的替代方案,您可以使用RegOverridePredefKey API。
答案 1 :(得分:3)
您可以使用进程间锁定机制将值写入您自己的应用程序的注册表,而不是挂钩dll的注册表访问权限。想法是instance1获取的锁在其dll“实例”读取值之前不会被释放,因此当instance2启动时,它将不会获得锁定,直到instance1完成。您需要一个可在进程之间工作的锁定机制。例如互斥。
创建互斥锁:
procedure CreateMutexes(const MutexName: string);
//Creates the two mutexes checked for by the installer/uninstaller to see if
//the program is still running.
//One of the mutexes is created in the global name space (which makes it
//possible to access the mutex across user sessions in Windows XP); the other
//is created in the session name space (because versions of Windows NT prior
//to 4.0 TSE don't have a global name space and don't support the 'Global\'
//prefix).
const
SECURITY_DESCRIPTOR_REVISION = 1; // Win32 constant not defined in Delphi 3
var
SecurityDesc: TSecurityDescriptor;
SecurityAttr: TSecurityAttributes;
begin
// By default on Windows NT, created mutexes are accessible only by the user
// running the process. We need our mutexes to be accessible to all users, so
// that the mutex detection can work across user sessions in Windows XP. To
// do this we use a security descriptor with a null DACL.
InitializeSecurityDescriptor(@SecurityDesc, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(@SecurityDesc, True, nil, False);
SecurityAttr.nLength := SizeOf(SecurityAttr);
SecurityAttr.lpSecurityDescriptor := @SecurityDesc;
SecurityAttr.bInheritHandle := False;
CreateMutex(@SecurityAttr, False, PChar(MutexName));
CreateMutex(@SecurityAttr, False, PChar('Global\' + MutexName));
end;
要发布互斥锁,您需要使用ReleaseMutex API并获取已创建的互斥锁,您将使用OpenMutex API。
对于CreateMutex,请参阅:http://msdn.microsoft.com/en-us/library/ms682411(VS.85).aspx
对于OpenMutex,请参阅:http://msdn.microsoft.com/en-us/library/ms684315(v=VS.85).aspx
对于ReleaseMutex,请参阅:http://msdn.microsoft.com/en-us/library/ms685066(v=VS.85).aspx
答案 2 :(得分:0)
脏方法:在hexeditor中打开dll并将注册表路径从原始配置单元更改/更改为您要使用的任何其他配置文件或进行适当的设置。