PDA

View Full Version : نوشتن در رجیستری ویندوز های 64 بیت



mehran901
پنج شنبه 13 تیر 1392, 02:24 صبح
سلام بر دوستان
اخیرا با مشکلی روبرو شدم گفتم بهتره مطرح کنم بلکه کسی بدونه قضیه چیه

من کاربر 32 بیت هستم و از اونجایی که برنامم میبایست رو 64 هم اجرا میشد واسه 64 بهینه شد و در نهایت بعد از اجرا شدن و نوشتن در رجیستری متوجه شدم اطلاعاتی که نوشته میشه ریدیرکت میشه در زیر مجموعه ساب کی : wow6432
مثلا من در آدرسی مشابه : hkey_local_machin/software/tst اطلاعاتی رو میخوام بخونم یا بنویسم ولی در مسیر hkey_local_machin/software/wow6432node/tst

اطلاعات نوشته و خونده میشه ... :| دوستان چیزی به ذهنشون میرسه ؟ من بخوام دقیقا تو مسیر صحیح بنویسم و بخونم باید چیکار کنم ؟

mehran901
جمعه 14 تیر 1392, 11:49 صبح
هیچکی ازاین موضوع اطلاعی نداره ؟ :افسرده:
من با ی سری روش ابتکاری مسئله خوندن و نوشتن رو حل کردم ولی میخوام کار اساسی باشه :متفکر:

بهروز عباسی
جمعه 14 تیر 1392, 11:59 صبح
من توی دلفی یه تابع نوشتم که 64bit بودن سیستم عامل رو تشخیص میده
اگه برنامه روی نسخه 64بیت باشه به ابتدای آدرس اون Wow6432Node اون رو اضافه میکنم و اگر هم 32بیت بود که مثل قدیما :دی .

اینم یه نمونه کد دلفی ،شاید کمکت کنه ؛
uses
Registry;

FUNCTION IsWOW64: Boolean;
TYPE // Type of IsWow64Process API fn
TIsWow64Process = function(Handle: THandle; var Res: BOOL): BOOL; stdcall;
VAR
IsWow64Result: BOOL; // result from IsWow64Process
IsWow64Process: TIsWow64Process; // IsWow64Process fn reference
BEGIN
// Try to load required function from kernel32
IsWow64Process := GetProcAddress(GetModuleHandle('kernel32'), 'IsWow64Process');
IF Assigned(IsWow64Process) THEN
BEGIN
// Function is implemented: call it
if not IsWow64Process(GetCurrentProcess, IsWow64Result) then
raise Exception.Create('Bad process handle');
// Return result of function
Result := IsWow64Result;
END
ELSE
// Function not implemented: can't be running on Wow64
Result := False;
END;

FUNCTION ProgramInstall(NameProgram: string): Boolean;
var
Reg: TRegistry;
RegKey: String;
Key: String;
BEGIN
Reg := TRegistry.Create;
TRY
Reg.RootKey := HKEY_LOCAL_MACHINE;
Key := 'SOFTWARE\';
IF IsWOW64 THEN Key := Key + 'Wow6432Node\';
Key := Key + 'Microsoft\Windows\CurrentVersion\Uninstall\' + NameProgram;

IF (Reg.OpenKeyReadOnly(Key)) AND (Reg.ValueExists('DisplayName')) THEN
BEGIN
RegKey := Reg.ReadString('DisplayName');
Reg.CloseKey;
Result := True;
END
ELSE
BEGIN
Reg.CloseKey;
Result := False;
END;
FINALLY
Reg.Free
END;
END;

mehran901
جمعه 14 تیر 1392, 13:18 عصر
من توی دلفی یه تابع نوشتم که 64bit بودن سیستم عامل رو تشخیص میده
اگه برنامه روی نسخه 64بیت باشه به ابتدای آدرس اون Wow6432Node اون رو اضافه میکنم و اگر هم 32بیت بود که مثل قدیما :دی .

اینم یه نمونه کد دلفی ،شاید کمکت کنه ؛
uses
Registry;

FUNCTION IsWOW64: Boolean;
TYPE // Type of IsWow64Process API fn
TIsWow64Process = function(Handle: THandle; var Res: BOOL): BOOL; stdcall;
VAR
IsWow64Result: BOOL; // result from IsWow64Process
IsWow64Process: TIsWow64Process; // IsWow64Process fn reference
BEGIN
// Try to load required function from kernel32
IsWow64Process := GetProcAddress(GetModuleHandle('kernel32'), 'IsWow64Process');
IF Assigned(IsWow64Process) THEN
BEGIN
// Function is implemented: call it
if not IsWow64Process(GetCurrentProcess, IsWow64Result) then
raise Exception.Create('Bad process handle');
// Return result of function
Result := IsWow64Result;
END
ELSE
// Function not implemented: can't be running on Wow64
Result := False;
END;

FUNCTION ProgramInstall(NameProgram: string): Boolean;
var
Reg: TRegistry;
RegKey: String;
Key: String;
BEGIN
Reg := TRegistry.Create;
TRY
Reg.RootKey := HKEY_LOCAL_MACHINE;
Key := 'SOFTWARE\';
IF IsWOW64 THEN Key := Key + 'Wow6432Node\';
Key := Key + 'Microsoft\Windows\CurrentVersion\Uninstall\' + NameProgram;

IF (Reg.OpenKeyReadOnly(Key)) AND (Reg.ValueExists('DisplayName')) THEN
BEGIN
RegKey := Reg.ReadString('DisplayName');
Reg.CloseKey;
Result := True;
END
ELSE
BEGIN
Reg.CloseKey;
Result := False;
END;
FINALLY
Reg.Free
END;
END;

خیلی ممنون ... کدشما هم رو بررسی کردم ، ولی مشکل اصلی اونجاست که من باید اینتری ای که در مسیر :
llocakmashin / software /barname1

هست رو بخونم یا ویرایش کنم ولی وقتی میخوام اطلاعاتی رو بنویسم مثلا مسیر دسترسی من آدرس بالا نیست آدرس پایینیه :
locak machin / software/ wow6432node/barname 1

هرچیم من تغییرات ایجاد کنم یا بخوام بنویسم و بخونم از این مسیر دومی استفاده میشه نه مسیر اصلی که من به اطلاعاتش نیاز دارم