View Full Version : نوشتن در رجیستری ویندوز های 64 بیت
  
mehran901
پنج شنبه 13 تیر 1392, 03:24 صبح
سلام بر دوستان 
اخیرا با مشکلی روبرو شدم گفتم بهتره مطرح کنم بلکه کسی بدونه قضیه چیه
من کاربر 32 بیت هستم و از اونجایی که برنامم میبایست رو 64 هم اجرا میشد واسه 64 بهینه شد و در نهایت بعد از اجرا شدن و نوشتن در رجیستری متوجه شدم اطلاعاتی که نوشته میشه ریدیرکت میشه در زیر مجموعه ساب کی : wow6432
مثلا من در آدرسی مشابه : hkey_local_machin/software/tst اطلاعاتی رو میخوام بخونم یا بنویسم ولی در مسیر hkey_local_machin/software/wow6432node/tst 
اطلاعات نوشته و خونده میشه ... :| دوستان چیزی به ذهنشون میرسه ؟ من بخوام دقیقا تو مسیر صحیح بنویسم و بخونم باید چیکار کنم ؟
mehran901
جمعه 14 تیر 1392, 12:49 عصر
هیچکی ازاین موضوع اطلاعی نداره ؟ :افسرده:
من با ی سری روش ابتکاری مسئله خوندن و نوشتن رو حل کردم ولی میخوام کار اساسی باشه :متفکر:
بهروز عباسی
جمعه 14 تیر 1392, 12: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, 14: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
هرچیم من تغییرات ایجاد کنم یا بخوام بنویسم و بخونم از این مسیر دومی استفاده میشه نه مسیر اصلی که من به اطلاعاتش نیاز دارم
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.