سلام ...
كل العام و انتم بخير ,,,
كيف يمكن اغلاق الجهاز في وندوز 2000 و XP
وشكرا
سلام ...
كل العام و انتم بخير ,,,
كيف يمكن اغلاق الجهاز في وندوز 2000 و XP
وشكرا
الأخ Madi
السلام عليكم ورحمة الله وبركاته
هذا الإجراء يمكنك من انهاء العمل في Windows NT/2000/XP يمكنك تجربته واستخدامه
procedure TForm1.Button1Click(Sender: TObject);
const
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
var
TokenHandle: THandle;
fResult : Boolean;
tkp: TTokenPrivileges;
L: DWORD;
begin
if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,TokenHandle)
then begin
ShowMessage('Handle the error here');
exit;
end;
if not LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME, tkp.Privileges[0].Luid) then
begin
ShowMessage('Handle the error here');
exit;
end;
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(TokenHandle, False, tkp, SizeOf(TTokenPrivileges), tkp1 ,L);
fResult:= InitiateSystemShutdown(nil,'Put your message here', 20, True, True);
if not fResult then
begin
ShowMessage('Handle the error here');
Exit;
end;
end;
[code]
أرجو ان يكون هذا ما تريد
بالنسبة لـWin9x يمكنك استخدام ExitWindowsEx وهي سهلة جدا
السلام عليكم
مشكور الف شكر خي العزيز .
جربت الكود لكن الجملة التالية ما رضت تشتغل
AdjustTokenPrivileges(TokenHandle, False, tkp, SizeOf(TTokenPrivileges), tkp ,L);
ورسالة الخطا كما يلي
There is no overloaded version of 'AdjustTokenPrivileges' that can be called with these arguments
وشكرا
الأخ Madi
حاول كتابة هذا الإجراء ضمن زر Button ولا تنادية.
أما إذا أردته مستقلا فيمكنك عمل الآتي:
var
Form1: TForm1
tpk1: TTokenPrivileges
L: DWORD
ثم ابدأ الإجراء كالتالي:
procedure ShutDown
var
tpk: TokenPrivileges;
fResult: Boolean;
begin
.
.
.
AdjustTokenPrivileges(TokenHandle,False, tkp, SizeOf(TTokenPrivileges), tkp1, L);
.
.
.
end
أرجو أن يكون هذا قد حل مشكلتك، علما بأني كتبت هذا البرنامج بـC++ وحولته إلى دلفي 6 واشتغل بدون مشاكل.
إذا كنت تستخدم اصدار أقدم فإن البرنامج قد يحتاج إلى تعديلات بسيطة.
أرجو أن أسمع ردك قريبا
و الله يا اخي العزيز انا بستخدم دلفي 5 , ووندوز 2000
لكن رسالة الخطاء تقول ان
There is no overloaded version of 'AdjustTokenPrivileges' that can be called with these arguments
وهدا يعني انه يوجد بارامترات ناقصة , او زائدة ,
وانا حاولت استخدم هده الدالة من قبل وواجهتن نفس المشكلة , لاني وجدت هده الملاحضة في مساعد دلفي
Windows NT: To shut down or restart the system, the calling process must use the AdjustTokenPrivileges function to enable the SE_SHUTDOWN_NAME privilege. For more information about security privileges, see Privileges.
ارجو المساعدة , وشكرا .
أخ Madi
حاول تغيير TokenHandle من Cardinal إلى THandle. وإذا ممكن تعطيني الكود اللي انت كاتبه ممكن نتوصل إلى حل
تمنياتي لك بالتوفيق
;) مشكور اي العزيز
جربت اغير النوع دون فائدة ,
وياريت احد من الاخوة الاعضاء يجرب الكود الى اعطاه اخي محمود ويقولنا النتيجة .
وهدا الكود الي انا كتبته في البرامج .
var
Form1: TForm1;
tkp1: TTokenPrivileges;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
const
SE_SHUTDOWN_NAME = 'SetShutdownPrivilege';
var
TokenHandle: THandle;
fResult : Boolean;
tkp: TTokenPrivileges;
L:PDWORD;
begin
if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,TokenHandle)
then begin
ShowMessage('Handle the error here');
exit;
end;
if not LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME, tkp.Privileges[0].Luid) then
begin
ShowMessage('Handle the error here');
exit;
end;
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(TokenHandle, False, tkp1, SizeOf(TTokenPrivileges), tkp ,L);
fResult:= InitiateSystemShutdown(nil,'Put your message here', 20, True, True);
if not fResult then
begin
ShowMessage('Handle the error here');
Exit;
end;
end;
وشكرا
(f)
أخي الكريم Madi
لقد وجدت هناك خطأين الأول من عندي والثاني من عندك:
1- في بداية الإجراء أخطأت أنا لأني كتبته مباشرة هنا :
const
SE_SHUTDOWN_NAME = 'SetShutdownPrivilege';
والصحيح هو:
const
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
ولو تنفذ برنامجك بشكل صحيح لظهرت لك الرسالة Handle the error here
2- خطأك الذي سبب لك رسالة الخطأ تلك وهو:
var
.
.
L : PDWORD;
وهذا خطأ والصحيح هو:
L: DWORD;
أنا جربت البرنامج على دلفي 5,6 اشتغل بشكل صحيح
ملاحظة مهمة: إذا اشتغل هذا البرنامج بشكل صحيح سوف لن يكون بإمكانك إيقافه لذلك قم بتخزين عملك قبل التنفيذ أو استخدم الدالة التالي لتمكنك من إلغاء عملية إغلاق النظام:
AbortSystemShutdown()
أتمنى أن هذا هو الحل مع تمنياتي لك بالتوفيق
حجرب و اقولك .
مشكوور اخي العزيز .
:'( :'(
بعد ان نجحت بفضل اخي العزيز محمد في القضاء على دلك ERROR اللعين , و لكن الفرحة ما تمت :'( ,
بعد ان تنفد البرنامج بحمد الله و بركاته , وضغطت على الزر و انتضر انطفا الجهاز , اجد امامي هده المرة مصيبة جديدة وهي اخر جملة
وهي
fResult:= InitiateSystemShutdown(nil,'Put your message here', 20, True, True);
حيت FRESULT يرجع بقيمة FALSE ومعناها , :confused:
الباين مافيش امل .....
شكرا لك اخي العزيز محمد على عاونك معي ......
;)
الأخ Madi
جرب وضع زر Button1 على الفورم ثم قم بنسخ الكود اللي كتبته انا وضعه داخل TForm1.Button1Click
جرب لأنك قد تكون أخطأت في أحد المتغيرات.
بالتوفيق ان شاء الله
عزيزي محمد
احسن حل هو انك تاخد نسخة من البرنامج بالكامل و تضعه ,
او ان تبعت لي ملف الفور على الايمايل فقط ملف الفورم الدي بامتداد
pas . وتكون فضلت علي ووفيت ..
ومجددا شكرا :o لتعاونك (f)
أخي Madi
هذا الملف .pas أرجو أن ترسل لي برنامجك إذا بالإمكان
حاولت أرسلك البرنامج كامل ولكن النظام لا يسمح إلا بـ1 بايت
unit MAin;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
tkp1: TTokenPrivileges;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
const
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
var
TokenHandle: Cardinal;
fResult : Boolean;
tkp: TTokenPrivileges;
L: DWORD;
begin
if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,TokenHandle)
then begin
ShowMessage('Handle the error here');
exit;
end;
if not LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME, tkp.Privileges[0].Luid) then
begin
ShowMessage('Handle the error here');
exit;
end;
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(TokenHandle, False, tkp, SizeOf(TTokenPrivileges), tkp1 ,L);
fResult:= InitiateSystemShutdown(nil,'Put your message here', 20, True, True);
if not fResult then
begin
ShowMessage('Handle the error here');
Exit;
end;
end;
end.
واخيرا :) :D
شكرا لك اخي العزيز محمد على مجهودك الطيب .
شكرا (*)
أخي Madi
إن شاء الله مشكلتك انتهت، لكن ضروري تضيف عليها AbortSystemShutdown()
تمنياتي لك بالتوفيق
أشكر الأخ Mohammed على تعاونه(f)(f)(f)
لقد عمل الكود الأخير (المذكور في المشاركة: هذا البرنامج بالكامل)
عمل بشكل صحيح و أطفأ الجهاز
أما عندما كتبته في إجراء لوحده و حذفت منه معالجات الخطأ قام بإعادة تشغيل الجهاز :eek:بدلاً من إطفائه؟؟!!
فلماذا كان ذلك علماً أن الشيفرة لدي هي على الشكل التالي:
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
tkp1: TTokenPrivileges;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
const SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
var
TokenHandle: Cardinal;
tkp: TTokenPrivileges;
L: DWORD;
begin
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,TokenHandle);
LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME, tkp.Privileges[0].Luid);
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(TokenHandle, False, tkp, SizeOf(TTokenPrivileges), tkp1 ,L);
InitiateSystemShutdown(nil,'', 0, True, True);
end;
end.
هذا الموضوع مغلق.