PDA

View Full Version : تشخیص نسخه سیستم عامل که ویندوز 8 و 8.1رو هم شامل بشه



hadisalahi2
چهارشنبه 05 آذر 1393, 10:58 صبح
سلام به همگی دوستان

من احتیاج به کدی دارم که بتونم ورژن سیستم عامل رو تشخیص بدم
خیلی کد از اینترنت گرفتم

اکثرشون درست جواب میدن ، اما یک مشکل بزرگ دارن ، که قابلیت شناسایی ویندوز 8 یا 8.1 رو ندارن

میخواستم بدونم دوستان کدید دارن که بتونه نوع ویندوز رو اگه 8 باشه هم تشخیص بده؟

ممنون از همگی

Mask
چهارشنبه 05 آذر 1393, 18:33 عصر
دقیقتر از این من ندیدم.
فقط حواستون باشه باید با دسترسی admin برنامه اجرا بشه.



function GetWindowsVersion: string;
var
VerInfo: TOsversionInfo;
PlatformId, VersionNumber: string;
Reg: TRegistry;
begin
VerInfo.dwOSVersionInfoSize := SizeOf(VerInfo);
GetVersionEx(VerInfo);
// Detect platform
Reg := TRegistry.Create;
Reg.RootKey := HKEY_LOCAL_MACHINE;
case VerInfo.dwPlatformId of
VER_PLATFORM_WIN32s:
begin
// Registry (Huh? What registry?)
PlatformId := 'Windows 3.1';
end;
VER_PLATFORM_WIN32_WINDOWS:
begin
// Registry
Reg.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVe rsion', False);
PlatformId := Reg.ReadString('ProductName');
VersionNumber := Reg.ReadString('VersionNumber');
end;
VER_PLATFORM_WIN32_NT:
begin
// Registry
Reg.OpenKey('\SOFTWARE\Microsoft\Windows NT\CurrentVersion', False);
PlatformId := Reg.ReadString('ProductName');
VersionNumber := Reg.ReadString('CurrentVersion');
end;
end;
Reg.Free;
Result := PlatformId + ' (version ' + VersionNumber + ')';
end;






procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessage(GetWindowsVersion);
end;

hadisalahi2
چهارشنبه 05 آذر 1393, 18:43 عصر
ممنون درست جواب میده
اما مشکل فقط اینه که حتما باید توی یوزر administrator باشه
و این خودش یک مشکل بزرگه

چند تا کد دیگه گرفتم ، ولی تا ویندوز 7 جواب میدادن
البته اونا از رجیستری استفاده نکرده بودن

شما با اون کدها کار نکردی؟

BORHAN TEC
چهارشنبه 05 آذر 1393, 21:28 عصر
با سلام


فقط حواستون باشه باید با دسترسی admin برنامه اجرا بشه.
نیازی به دسترسی ادمین نیست چون فقط داریم اطلاعات میخونیم و نمینویسیم. برای حل این مسئله به نظر من بهترین تابع مربوط به JCL میشه که خیلی کامله و از تمامی نسخ وبندوز پشتیبانی می کنه:
این هم از نسخه های ویندوز پشتیبانی شده تا به حال:
TWindowsVersion = (wvUnknown, wvWin95, wvWin95OSR2, wvWin98, wvWin98SE, wvWinME,
wvWinNT31, wvWinNT35, wvWinNT351, wvWinNT4, wvWin2000, wvWinXP,
wvWin2003, wvWinXP64, wvWin2003R2, wvWinVista, wvWinServer2008,
wvWin7, wvWinServer2008R2, wvWin8, wvWin8RT, wvWinServer2012, wvWin81,
wvWin81RT, wvWinServer2012R2);
برای استفاده از این تابع JCL رو نصب کنید و از یونیت JclSysInfo و تابع GetWindowsVersion استفاده کنید.
موفق باشید...

Mask
چهارشنبه 05 آذر 1393, 22:12 عصر
یوزر administrator باشه
نیاز به اجرا در یوزر administrator نیست .باید در مد administrator اجرا بشه . یعنی run as administrator



نیازی به دسترسی ادمین نیست چون فقط داریم اطلاعات میخونیم و نمینویسیم.
این صحبت شما برای ویندوز سون بود. در نسخه 8 یا 8.1 باید برای اجرای صحیح این برنامه، حتما باید run as administrator اجرا بشه.
البته روش شاهین عزیز بدون نیاز به مجوز هست . میتونید بدون مشکل استفاده کنید.

arash_ebrahimi_nk
پنج شنبه 06 آذر 1393, 07:41 صبح
خوبی آپدیت کردن دلفی اینه که کُدها بر اساس آخرین اطلاعات MSDN آپدیت میشن. در دلفی XE6 و XE7 توی یونیت Sysutils تابع زیر رو نگاه کنید:

{ TOSVersion }

class constructor TOSVersion.Create;
{$IFDEF MSWINDOWS}
function IsWindowsServer: Boolean;
var
osvi: TOSVersionInfoEx;
dwlConditionMask: ULONGLONG;
begin
FillChar(osvi, SizeOf(TOSVersionInfoEX), 0);
osvi.wProductType := VER_NT_WORKSTATION;

dwlConditionMask := VerSetConditionMask(0, VER_PRODUCT_TYPE, VER_EQUAL);

Result := VerifyVersionInfo(osvi, VER_PRODUCT_TYPE, dwlConditionMask) = FALSE;
end;

const
CArchitectures: array[Boolean] of TArchitecture = (arIntelX86, arIntelX64);
var
SysInfo: TSystemInfo;
VerInfo: TOSVersionInfoEx;
MajorNum, MinorNum, BuildNum: DWORD;
ServicePackMajorNum, ServicePackMinorNum: WORD;
begin
ZeroMemory(@VerInfo, SizeOf(VerInfo));
VerInfo.dwOSVersionInfoSize := SizeOf(VerInfo);
GetVersionEx(VerInfo);

FPlatform := pfWindows;
FMajor := VerInfo.dwMajorVersion;
FMinor := VerInfo.dwMinorVersion;
FBuild := VerInfo.dwBuildNumber;
FServicePackMajor := VerInfo.wServicePackMajor;
FServicePackMinor := VerInfo.wServicePackMinor;

ZeroMemory(@SysInfo, SizeOf(SysInfo));
if Check(5, 1) then // GetNativeSystemInfo not supported on Windows 2000
GetNativeSystemInfo(SysInfo);
FArchitecture := CArchitectures[SysInfo.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64];

if (FMajor > 6) or ((FMajor = 6) and (FMinor > 1)) then
begin
BuildNum := FBuild;
FixWindowsVersion(MajorNum, MinorNum, ServicePackMajorNum, ServicePackMinorNum, BuildNum);
FMajor := MajorNum;
FMinor := MinorNum;
FServicePackMajor := ServicePackMajorNum;
FServicePackMinor := ServicePackMinorNum;
FBuild := BuildNum;
end;

FName := SWindows;
case FMajor of
6: case FMinor of
0: if VerInfo.wProductType = VER_NT_WORKSTATION then
FName := SWindowsVista
else
FName := SWindowsServer2008;
1: if VerInfo.wProductType = VER_NT_WORKSTATION then
FName := SWindows7
else
FName := SWindowsServer2008R2;
2: if VerInfo.wProductType = VER_NT_WORKSTATION then
FName := SWindows8
else
FName := SWindowsServer2012;
3: if not IsWindowsServer then
FName := SWindows8Point1
else
FName := SWindowsServer2012R2;
end;
5: case FMinor of
0: FName := SWindows2000;
1: FName := SWindowsXP;
2:
begin
if (VerInfo.wProductType = VER_NT_WORKSTATION) and
(SysInfo.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64) then
FName := SWindowsXP
else
begin
if GetSystemMetrics(SM_SERVERR2) = 0 then
FName := SWindowsServer2003
else
FName := SWindowsServer2003R2
end;
end;
end;
end;
end;
{$ENDIF MSWINDOWS}


نیازی به چک کردن رجیستری یا دسترسی Admin نداره.

و یه تابع مهم که بر اساس آخرین تغییرات MSDN نوشته شده:


{$IFDEF MSWINDOWS}
procedure FixWindowsVersion(var MajorVersion, MinorVersion: DWORD; var ServicePackMajor, ServicePackMinor: WORD; var BuildNumber: DWORD);
const
MAX_VERS = 20;
var
I: Integer;
L, R: DWORD;
maskBit: DWord;
osvi: TOSVersionInfoEx;
ConditionMask, EqualMask: ULONGLONG;
begin
FillChar(osvi, SizeOf(TOSVersionInfoEx), 0);
osvi.dwOSVersionInfoSize := SizeOf(TOSVersionInfoEx);

// Try to find MajorVersion
MajorVersion := 0;
ConditionMask := VerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL);
for I := 6 to MAX_VERS do
begin
osvi.dwMajorVersion := I;
if VerifyVersionInfo(osvi, VER_MAJORVERSION, ConditionMask) then
begin
MajorVersion := I;
Break;
end;
end;

//Try to find MinorVersion
MinorVersion := 0;
ConditionMask := VerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL);
for I := 0 to $0F do
begin
osvi.dwMinorVersion := I;
if VerifyVersionInfo(osvi, VER_MINORVERSION, ConditionMask) then
begin
MinorVersion := I;
Break;
end;
end;

ServicePackMajor := 0;
osvi.wServicePackMajor := ServicePackMajor;
if not VerifyVersionInfo(osvi, VER_SERVICEPACKMAJOR, VerSetConditionMask(0, VER_SERVICEPACKMAJOR, VER_EQUAL)) then
begin
MaskBit := $80; // Left most bit of WORD;
ConditionMask := VerSetConditionMask(0, VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
while MaskBit > 0 do
begin
osvi.wServicePackMajor := ServicePackMajor or MaskBit;
if VerifyVersionInfo(osvi, VER_SERVICEPACKMAJOR, ConditionMask) then
ServicePackMajor := ServicePackMajor or MaskBit;
MaskBit := MaskBit shr 1;
end;
end;

ServicePackMinor := 0;
osvi.wServicePackMinor := ServicePackMinor;
if not VerifyVersionInfo(osvi, VER_SERVICEPACKMINOR, VerSetConditionMask(0, VER_SERVICEPACKMINOR, VER_EQUAL)) then
begin
MaskBit := $80; // Left most bit of WORD;
ConditionMask := VerSetConditionMask(0, VER_SERVICEPACKMINOR, VER_GREATER_EQUAL);
while MaskBit > 0 do
begin
osvi.wServicePackMinor := ServicePackMinor or MaskBit;
if VerifyVersionInfo(osvi, VER_SERVICEPACKMINOR, ConditionMask) then
ServicePackMinor := ServicePackMinor or MaskBit;
MaskBit := MaskBit shr 1;
end;
end;

osvi.dwBuildNumber := BuildNumber;
if not VerifyVersionInfo(osvi, VER_BUILDNUMBER, VerSetConditionMask(0, VER_BUILDNUMBER, VER_EQUAL )) then
begin
L := BuildNumber;
if VerifyVersionInfo(osvi, VER_BUILDNUMBER, VerSetConditionMask(0, VER_BUILDNUMBER, VER_LESS )) then
L := 0;
R := $7FFF; // It may be enough for Windows's build number

EqualMask := VerSetConditionMask(0, VER_BUILDNUMBER, VER_EQUAL);
ConditionMask := VerSetConditionMask(0, VER_BUILDNUMBER, VER_GREATER);
while L < R do
begin
BuildNumber := (L + R) div 2;
osvi.dwBuildNumber := BuildNumber;
if VerifyVersionInfo(osvi, VER_BUILDNUMBER, EqualMask) then
Break
else if VerifyVersionInfo(osvi, VER_BUILDNUMBER, ConditionMask) then
L := BuildNumber
else
R := BuildNumber;
end;
end;
end;

hadisalahi2
پنج شنبه 06 آذر 1393, 10:18 صبح
خوبی آپدیت کردن دلفی اینه که کُدها بر اساس آخرین اطلاعات MSDN آپدیت میشن. در دلفی XE6 و XE7 توی یونیت Sysutils تابع زیر رو نگاه کنید:




من نسخه XE2 کار میکنم ، آیا در این نسخه هم این کد کاربرد داره؟
در ضمن این سر و ته تابع کجاست؟ چطوری فراخوانیش کنم؟




نیازی به دسترسی ادمین نیست چون فقط داریم اطلاعات میخونیم و نمینویسیم. برای حل این مسئله به نظر من بهترین تابع مربوط به JCL میشه که خیلی کامله و از تمامی نسخ وبندوز پشتیبانی می کنه:

شاهین جان
دستت طلا JCL متاسفانه به دلایلی روی سیستم من نصب نشد
چون هم D2007 دارم و هم XE2




این صحبت شما برای ویندوز سون بود. در نسخه 8 یا 8.1 باید برای اجرای صحیح این برنامه، حتما باید run as administrator اجرا بشه.

آره تست کردم ، توی ویندوز 8.1 خالی برمیگردونه ، البته یوزر معمولی
من توی یوزر Administrator اجرا کردم ، درست خروجی داشت.

BORHAN TEC
پنج شنبه 06 آذر 1393, 10:59 صبح
من نسخه XE2 کار میکنم ، آیا در این نسخه هم این کد کاربرد داره؟
بله این رکورد دقیقاً از زمان دلفی XE2 اضافه شد.


آره تست کردم ، توی ویندوز 8.1 خالی برمیگردونه
کد مربوط به تابع مربوطه در JCL رو به شکلی در آوردم که نیازی به نصب JCL نداره و از تمام نسخه های ویندوز تا به امروز پشتیبانی میکنه (به غیر از ویندوز 10). این هم از یونیت مربوطه:
unit Unit2;

interface


uses
Winapi.Windows,
System.Types,
System.SysUtils,
System.Win.Registry;


type
TWindowsVersion = (wvUnknown, wvWin95, wvWin95OSR2, wvWin98, wvWin98SE,
wvWinME, wvWinNT31, wvWinNT35, wvWinNT351, wvWinNT4, wvWin2000, wvWinXP,
wvWin2003, wvWinXP64, wvWin2003R2, wvWinVista, wvWinServer2008, wvWin7,
wvWinServer2008R2, wvWin8, wvWin8RT, wvWinServer2012, wvWin81, wvWin81RT,
wvWinServer2012R2);


function GetWindowsVersion: TWindowsVersion; forward;


implementation


var
KernelVersionHi: DWORD;


const
RsOSVersionWin81 = 'Windows 8.1';
RsOSVersionWinServer2012R2 = 'Windows Server 2012 R2';


function GetWindowsVersion: TWindowsVersion;
var
TrimmedWin32CSDVersion: string;
SystemInfo: TSystemInfo;
OSVersionInfoEx: TOSVersionInfoEx;
Win32MinorVersionEx: integer;
ProductName: string;
Reg: TRegistry;
const
SM_SERVERR2 = 89;
begin
Result := wvUnknown;
TrimmedWin32CSDVersion := Trim(Win32CSDVersion);
case Win32Platform of
VER_PLATFORM_WIN32_WINDOWS:
case Win32MinorVersion of
0 .. 9:
if (TrimmedWin32CSDVersion = 'B') or (TrimmedWin32CSDVersion = 'C')
then
Result := wvWin95OSR2
else
Result := wvWin95;
10 .. 89:
// On Windows ME Win32MinorVersion can be 10 (indicating Windows 98
// under certain circumstances (image name is setup.exe). Checking
// the kernel version is one way of working around that.
if KernelVersionHi = $0004005A then // 4.90.x.x
Result := wvWinME
else if (TrimmedWin32CSDVersion = 'A') or
(TrimmedWin32CSDVersion = 'B') then
Result := wvWin98SE
else
Result := wvWin98;
90:
Result := wvWinME;
end;
VER_PLATFORM_WIN32_NT:
case Win32MajorVersion of
3:
case Win32MinorVersion of
1:
Result := wvWinNT31;
5:
Result := wvWinNT35;
51:
Result := wvWinNT351;
end;
4:
Result := wvWinNT4;
5:
case Win32MinorVersion of
0:
Result := wvWin2000;
1:
Result := wvWinXP;
2:
begin
OSVersionInfoEx.dwOSVersionInfoSize := SizeOf(OSVersionInfoEx);
SystemInfo.dwOemId := 0;
GetNativeSystemInfo(SystemInfo);
if GetSystemMetrics(SM_SERVERR2) <> 0 then
Result := wvWin2003R2
else if (SystemInfo.wProcessorArchitecture <>
PROCESSOR_ARCHITECTURE_INTEL) and
GetVersionEx(OSVersionInfoEx) and
(OSVersionInfoEx.wProductType = VER_NT_WORKSTATION) then
Result := wvWinXP64
else
Result := wvWin2003;
end;
end;
6:
begin
Win32MinorVersionEx := Win32MinorVersion;


// Workaround to differentiate Windows 8.1 and Windows Server 2012 R2 from Windows 8 and Windows Server 2012
if Win32MinorVersionEx = 2 then
begin
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
ProductName := Reg.ReadString(
'SOFTWARE\Microsoft\Windows NT\CurrentVersion');
finally
Reg.Free;
end;


if (pos(RsOSVersionWin81, ProductName) = 1) or
(pos(RsOSVersionWinServer2012R2, ProductName) = 1) then
Win32MinorVersionEx := 3;
end;


case Win32MinorVersionEx of
0:
begin
// Windows Vista and Windows Server 2008
OSVersionInfoEx.dwOSVersionInfoSize :=
SizeOf(OSVersionInfoEx);
if GetVersionEx(OSVersionInfoEx) and
(OSVersionInfoEx.wProductType = VER_NT_WORKSTATION) then
Result := wvWinVista
else
Result := wvWinServer2008;
end;
1:
begin
// Windows 7 and Windows Server 2008 R2
OSVersionInfoEx.dwOSVersionInfoSize :=
SizeOf(OSVersionInfoEx);
if GetVersionEx(OSVersionInfoEx) and
(OSVersionInfoEx.wProductType = VER_NT_WORKSTATION) then
Result := wvWin7
else
Result := wvWinServer2008R2;
end;
2:
begin
// Windows 8 and Windows Server 2012
OSVersionInfoEx.dwOSVersionInfoSize :=
SizeOf(OSVersionInfoEx);
if GetVersionEx(OSVersionInfoEx) and
(OSVersionInfoEx.wProductType = VER_NT_WORKSTATION) then
Result := wvWin8
else
Result := wvWinServer2012;
end;
3:
begin
// Windows 8.1 and Windows Server 2012 R2
OSVersionInfoEx.dwOSVersionInfoSize :=
SizeOf(OSVersionInfoEx);
if GetVersionEx(OSVersionInfoEx) and
(OSVersionInfoEx.wProductType = VER_NT_WORKSTATION) then
Result := wvWin81
else
Result := wvWinServer2012R2;
end;
end;
end;
end;
end;
end;


end.

در ضمن در ویندوز 8.1 هم تست کردم و بدون نیاز به Run as admin به درستی کار میکنه.
این هم یک مثال ساده از نحوه استفاده برای دوستان مبتدی تر که ممکنه بعداً نیازشون بشه:
uses Unit2;


procedure TForm1.Button1Click(Sender: TObject);
begin


case GetWindowsVersion of
wvUnknown:
Caption := 'Unknown';
wvWin95:
Caption := 'Win95';
wvWin95OSR2:
Caption := 'Win95OSR2';
wvWin98:
Caption := 'Win98';
wvWin98SE:
Caption := 'Win98SE';
wvWinME:
Caption := 'WinME';
wvWinNT31:
Caption := 'WinNT31';
wvWinNT35:
Caption := 'WinNT35';
wvWinNT351:
Caption := 'WinNT351';
wvWinNT4:
Caption := 'WinNT4';
wvWin2000:
Caption := 'Win2000';
wvWinXP:
Caption := 'WinXP';
wvWin2003:
Caption := 'Win2003';
wvWinXP64:
Caption := 'WinXP64';
wvWin2003R2:
Caption := 'Win2003R2';
wvWinVista:
Caption := 'WinVista';
wvWinServer2008:
Caption := 'WinServer2008';
wvWin7:
Caption := 'Win7';
wvWinServer2008R2:
Caption := 'WinServer2008R2';
wvWin8:
Caption := 'Win8';
wvWin8RT:
Caption := 'Win8RT';
wvWinServer2012:
Caption := 'WinServer2012';
wvWin81:
Caption := 'Win81';
wvWin81RT:
Caption := 'Win81RT';
wvWinServer2012R2:
Caption := 'WinServer2012R2';
end;


end;




موفق باشید...

Mask
پنج شنبه 06 آذر 1393, 17:30 عصر
با اجازت من تست زدم روی نسخه XE
البته اینم بگم که jvcl رو نصب ندارم. چون گفتید جدا کردید و نیاز به نصب نیست من تست زدم و به VER_NT_WORKSTATION و PROCESSOR_ARCHITECTURE_INTEL گیر میده.
یونیت ضمیمه رو ببینید.

BORHAN TEC
پنج شنبه 06 آذر 1393, 18:45 عصر
لبته اینم بگم که jvcl رو نصب ندارم. چون گفتید جدا کردید و نیاز به نصب نیست من تست زدم و به VER_NT_WORKSTATION و PROCESSOR_ARCHITECTURE_INTEL گیر میده.

دلفی XE نداشتم و کد رو با Delphi 2010 تست کردم و به این نتیجه رسیدم که ثابت های زیر باید توی یونیت مربوطه وجود داشته باشه تا کد به درستی کار کنه:
const RsOSVersionWin81 = 'Windows 8.1';
RsOSVersionWinServer2012R2 = 'Windows Server 2012 R2';
PROCESSOR_ARCHITECTURE_INTEL = 0;
{$EXTERNALSYM PROCESSOR_ARCHITECTURE_INTEL}
PROCESSOR_ARCHITECTURE_AMD64 = 9;
{$EXTERNALSYM PROCESSOR_ARCHITECTURE_AMD64}
PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 = 10;
{$EXTERNALSYM PROCESSOR_ARCHITECTURE_IA32_ON_WIN64}
PROCESSOR_ARCHITECTURE_IA64 = 6;
{$EXTERNALSYM PROCESSOR_ARCHITECTURE_IA64}
VER_NT_WORKSTATION = $0000001;
{$EXTERNALSYM VER_NT_WORKSTATION}
VER_NT_DOMAIN_CONTROLLER = $0000002;
{$EXTERNALSYM VER_NT_DOMAIN_CONTROLLER}
VER_NT_SERVER = $0000003;
یونیتی که ضمیمه کرده ام الان باید بدون مشکل توی دلفی 2010 و نسخه های جدیدتر کار کنه.

یوسف زالی
پنج شنبه 06 آذر 1393, 19:49 عصر
شاهین اون تابع دوم رو به راحتی می تونستی خلاصش کنی و البته قابل گسترش:


Result := Copy(GetEnumName(TypeInfo(TWindowsVersion), integer(GetWindows)), 3, 100);

ابن طوری با همین کد و با تغییر تنها در یک تابع در آینده ساپورت نسخه های دیگه رو هم داریم.

BORHAN TEC
پنج شنبه 06 آذر 1393, 21:03 عصر
شاهین اون تابع دوم رو به راحتی می تونستی خلاصش کنی و البته قابل گسترش
تابع دومیه که کلاً سرکاریه و فقط میخواستم نحوه تست نسخه ویندوز رو نشون بدم که Mask توی اون یونیت اومد به صورت یک تابع تعریفش کرد. همیچنین این تابع نام کامل رو بر نمیگردونه مثلاً به جای Win7 باید Windows 7 برگردونده بشه.

Mask
جمعه 07 آذر 1393, 01:07 صبح
ممنون.
جسارتا ویندوز 8.1 رو متاسفانه 8 شناسایی میکنه.

BORHAN TEC
جمعه 07 آذر 1393, 14:40 عصر
جسارتا ویندوز 8.1 رو متاسفانه 8 شناسایی میکنه.
مطمئنی؟! من همین الان روی ویندوز 8.1 Enterprise نسخه 32 بیتی و 64 بیتی تست کردم ودرست کار کرد.

Mask
شنبه 08 آذر 1393, 18:18 عصر
عکس رو ببینید.
126142

BORHAN TEC
شنبه 08 آذر 1393, 21:57 عصر
خطاب به Mask (http://barnamenevis.org/member.php?74166-Mask):قلب:
با اطمینان (نزدیک به 100 درصد) میتونم بگم که این یکی که الان ضمیمه کردم درست کار میکنه. اگه اینطور بود حتماً خبرش رو بده.
کد من دو تا اشکال داشت:
یک - نحوه استفاده از رجیستری اشتباه بود(یکسری نکات رو در این مورد فراموش کرده بودم که یادآوری شد). :لبخند:
دو - همانطور که گفته بودی توی ویندوز 8.1 نمیشه به صورت عادی کلیدهای شاخه HKLM مربوط به رجیستری رو خواند و برای اینکه بشه خوندش حتماً باید برنامه بصورت Run As Administrator اجرا بشه که برای رفع این مشکل میشه از پروپرتی Access مربوط به یک شی از کلاس TRegistry استفاده کرد. :چشمک:

نکته: در برخی از ویندوزهای 8.1 ویژگی Minor Version مقدار 2 و در برخی دیگر مقدار 3 داره، که روی سیستم شما مقدار 2 داره! :متفکر:

hadisalahi2
یک شنبه 09 آذر 1393, 09:42 صبح
شاهین جان بی نهایت سپاسگذارم :قلب:
اما لطفا به جای اون لیبلی که گذاشتی و از نوع Raize فک کنم باشه
یک لیبل معمولی بزار تا برو بچ که دانلود میکنن ، فک نکنن مشکلی توی کد هست. :لبخند:

یا حق

Mask
یک شنبه 09 آذر 1393, 11:39 صبح
با اطمینان (نزدیک به 100 درصد) میتونم بگم که این یکی که الان ضمیمه کردم درست کار میکنه. اگه اینطور بود حتماً خبرش رو بده
بله درست کار میکنه داداش. ممنون.


اما لطفا به جای اون لیبلی که گذاشتی و از نوع Raize فک کنم باشه
شما یونیت GetOs رو بردار. بقیش زیاد مهم نیست.