سؤال

لدينا بيرل البرنامج الذي ركض جيدا على جميع منصات ويندوز حتى الآن.

عندما حاولت ذلك على صدر حديثا Windows Server 2008 R2 ، توقفت عن العمل.وكشف التحقيق أن المشكلة هي أن يدعو إلى قراءة قيم التسجيل باستخدام TieRegistry عاد معرف القيم.

هذه مشكلة معروفة?هل أي شخص واجهت مشكلة في الوصول إلى التسجيل على نظام التشغيل Windows Server 2008 R2 باستخدام TieRegistry?أنا تشغيل البرنامج كمسؤول ، لذلك أنا لا أعتقد أنه هو إذن المشاكل.البرنامج يعمل بشكل ممتاز و قراءة التسجيل بشكل صحيح على ويندوز 7 و ويندوز فيستا.

عينة البرنامج النصي كتبت إلى الوصول إلى التسجيل تفشل أيضا:

use Win32::TieRegistry(Delimiter=>'\\');
my $reg = "HKEY_LOCAL_MACHINE\\SOFTWARE\\TEST\\Value1";
my $val = $Registry->{$reg};
print "val: ".$val."\n";

سيكون موضع تقدير أي مساعدة.

شكرا splintor

هل كانت مفيدة؟

المحلول 2

لقد وجدت مصدر المشكلة.

من أجل جعل TieRegistry تعمل بشكل جيد على ويندوز 64-بت ، والوصول الصحيح خلية التسجيل كنا الحل اقترح توني B.Okusanya (كما نقلت هنا).بيد أن هذا الحل يضيف على حد سواء KEY_WOW64_64KEY و KEY_WOW64_32KEY إلى الوصول إلى المعلمة التي ليست منطقية – سواء كنت ترغب في الوصول إلى التسجيل 64-بت واستخدام KEY_WOW64_64KEY أو كنت تريد التسجيل 32-بت و استخدام KEY_WOW64_32KEY.باستخدام كل من لا يجعل من أي معنى.

ومع ذلك ، في الإصدارات السابقة من ويندوز ، وكذلك ويندوز 7, يبدو أنه عندما RegOpenKeyEx يلاحظ أن KEY_WOW64_64KEY العلم في access المعلمة ، ويستخدم التسجيل 64-بت, و يتجاهل KEY_WOW64_32KEY العلم. نظام التشغيل Windows Server 2008 R2, من ناحية أخرى, لا تتجاهل KEY_WOW64_32KEY العلم, و إذا كان كل من الأعلام ، فتح مفتاح التسجيل تفشل ، Win32API::Registry.regLastError إرجاع الخطأ The parameter is incorrect.

إزالة |KEY_WOW64_32KEY من تغير TieRegistry.pm تحل مشكلة وتسبب في التطبيق لدينا للعمل مرة أخرى.

التحيات ،

splintor

نصائح أخرى

ومنذ جوجل يحب الخروج مع هذا عندما الناس يبحثون عن الحل كنت احسب أن إسقاط ملحوظة صغيرة.

وليس لديك لتعديل TieRegistry.pm إلى الحصول على هذا العمل. كل ما عليك القيام به هو إضافة "الوصول" المعلمة إلى المكالمة. هنا مثال:

my $rk = Win32::TieRegistry->new('LMachine\Software\Microsoft\Microsoft SQL Server\Instance Names\SQL', {Access=> 0x20019|0x0200});

وهناك نوعان من الأعلام فوق أورد معا:

0x20019  -- Read access to keys
0x0200   -- Access the 64 bit version of registry (ignored on 32 bit systems)

ويمكنك أيضا استخدام 0x0100 للوصول إلى صيغة توجيه 32 بت من التسجيل (تجاهل أيضا على أنظمة 32 بت)

وبهذه الطريقة لم يكن لديك لتعديل مكتبة وبرنامج واحد يمكن الوصول إلى كلا الإصدارين من التسجيل.

وهذه المرة الأولى التي نشرها هنا. هنا كان الحل خطرت لي ومثال على استخدامه:

use Win32::TieRegistry( Delimiter=>"#", ArrayValues=>0 );
my $pound              = $Registry->Delimiter("/");
my $fileSep            = "\\"; 
my $path               = "";
my $PerlBin            = "";
my $PerlInstallDir     = "";
my $PerlInstallDrive   = "";
my $SybaseInstallDir   = "";
my $SybaseInstallDrive = "";


# Standard syntax for access to 32-bit registry
my $regKey = $Registry->{"HKEY_LOCAL_MACHINE/SOFTWARE/Perl"};   
print "\n\n\n" . "Accessing 32 bit registry for Perl Info:" ."\n\n\n";
foreach $key (keys %$regKey){
    print"$key: " . $regKey->{"$key"} . "\n";
}

$path = $regKey->{"/"};
$PerlInstallDir = Win32::GetShortPathName($path);
$path = $regKey->{"/BinDir"};
$PerlBin = Win32::GetShortPathName($path);
$PerlInstallDrive  = substr($PerlInstallDir, 0, 2) . $fileSep;

print "\n\n\n" . "Accessing 64 bit registry for Sybase Info:" ."\n\n\n";

 # This syntax passes the HEX flag to access the 64 bit registry
$regKey = $Registry->Open("HKEY_LOCAL_MACHINE/SOFTWARE/SYBASE/Setup", {Access=> 0x20019|0x0100});
foreach $key (keys %$regKey){
    print"$key: " . $regKey->{"$key"} . "\n";
}
$path = $regKey->{"/SYBASE"};
$SybaseInstallDir = Win32::GetShortPathName($path);
$SybaseInstallDrive = substr($SybaseInstallDir, 0, 2) . $fileSep;


print "\n\n\nFinished retrieving registry info:" . "\n";
print "Perl executable Location  == $PerlBin" . "\n";
print "Perl Install Drive        == $PerlInstallDrive" . "\n";
print "Perl Install Directory    == $PerlInstallDir" . "\n";
print "Sybase Install Drive      == $SybaseInstallDrive" . "\n";
print "Sybase Install Directory  == $SybaseInstallDir" . "\n";

وهذا يعمل بالنسبة لي

use Win32::TieRegistry (
ArrayValues => 0,
SplitMultis => 1, AllowLoad => 1,
 qw(:KEY_), Delimiter => '/', FixSzNulls => 1
);

use constant KEY_WOW => (uc($ENV{PROCESSOR_ARCHITECTURE}) eq "AMD64" || uc($ENV{PROCESSOR_ARCHITEW6432}) eq "AMD64") ? 0x100 : 0x200;

$Registry->Open('LMachine/Software/Microsoft/',{Access => KEY_READ | KEY_WOW});
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top