تلقيت سؤالاً من أحد الأصدقاء عن كيفية استعراض الحواسب الموجودة في "جوار شبكة الاتصال" وطبعاً بواسطة دلفي و هنا سأعرض لفكرة الحل التي يمكن الاستفادة منها أو تطويرها و البناء عليها للوصول إلى الهدف المنشود.
قد يكون هناك أكثر من طريقة للقيام بذلك في دلفي و لكن هنا سأعرض لكيفية القيام بذلك بواسطة توابع الـ API
قبل البدء بالعمل هناك أشياء و مفاهيم جديدة لابد من الاطلاع عليها
1-TNetResource :
وهو عبارة عن Packed Record يعبر عن موارد الشبكة و مكوناته :
dwScope: DWORD;
dwType: DWORD;
dwDisplayType: DWORD;
dwUsage: DWORD;
lpLocalName: PAnsiChar;
lpRemoteName: PAnsiChar;
lpComment: PAnsiChar;
lpProvider: PAnsiChar;
وطبعاً ما يهمنا هنا أكثر من غيره هو lpRemoteName الذي يعبر عن اسم الحاسب ويمكنكم الاطلاع على هذا الموضوع أكثر من خلال الـ Documentation
2 – التابع WNetOpenEnum :
وهو تابع في المكتبة mpr.dll ويأخذ الشكل :
WNetOpenEnum (dwScope : DWord; dwType : DWord; dwUsage : DWord; lpNetResource : PNetResourceA; var lphEnum : Cardinal);
يمكنك أيضاً الاطلاع على مزيد من المعلومات حول هذا التابع من خلال الـ Documentation و يمكن أن نستعرض بشكل سريع دلالة كل بارامتر
dwScope : يدل على مجال البحث و في حالة البحث في جوار شبكة الاتصال يجب أن تكون قيمته RESOURCE_CONTEXT
dwType : يدل على نوع المورد الذي نريد البحث عنه و في حالة البحث عن الحواسب يمكننا استخدام القيمة RESOURCETYPE_ANY
dwUsage : يدل على استعمال المورد ويمكننا في حالة البحث عن حواسب الشبكة يمكننا استخدام القيمة صفر
lpNetResource : هو مؤشر Pointer إلى مورد الشبكة في حال أردنا البحث عن موارد الشبكة ضمن مورد شبكة (مجلدات المشاركة في حاسب شبكة مثلاً)
وفي حالة البحث عن أسماء الحواسب فقط لا حاجة لإسناد قيمة لهذا البارامتر
lphEnum : هو بارامتر خرج وهو ممسك THandle سيتم استخدامه في تابع البحث WNetEnumResource
التابع WNetEnumResource :
وهو يأخذ الشكل التالي :
WNetEnumResource (hEnum : Cardinal; var lpcCount : Cardinal; lpBuffer : Pointer; var lpBufferSize : Cardinal)
و أيضاً نستعرض بشكل سريع دلالة كل بارامتر :
hEnum : هو الممسك الذي أعاده التابع الأول WNetOpenEnum .
lpcCount : وهو بارامتر دخل وخرج يدل على عدد الموارد المراد البحث عنها و هو عند نجاح تنفيذ التابع سيعيد عدد الموارد المكتشفة بما أنه بارامتر دخل وخرج.
lpBuffer : هو مؤشر Pointer إلى الـ Buffer الذي سيخزن نتيجة البحث و هذه الـ Buffer بالمناسبة ستكون من النوع TNetResource الذي سبق شرحها ويجب أن يكون حجمها بحيث يغطي نتيجة البحث المتوقعة.
lpBufferSize : هو بارامتر دخل خرج يحوي حجم الـ Buffer المراد تخزين نتيجة البحث فيها
الآن و بعد هذه المقدمة المختصرة يمكننا كتابة كود دلفي بسيط يقوم باستعراض حواسب الموجودة في شبكة الاتصال المثال سيتضمن نموذج Form وعليه Button و Listbox ونضيف الشيفرة التالية للحدث Click
procedure TForm1.Button1Click(Sender: TObject);
var
hEnum : Thandle;
NetResource: Array[0..100] of TNetResource; // الحجم الذي ترغب به
ResourceCount,ResourceSize : DWord;
I,Chk: Integer;
begin
chk := WNetOpenEnum(RESOURCE_CONTEXT,RESOURCETYPE_ANY,0,nil,hEnum);
if Chk <> NO_ERROR then
Begin
ShowMessage ('لا يمكن العثور على شبكة الاتصال');
Exit;
End;
ResourceCount := 100;
ResourceSize := SizeOf(NetResource);
WNetEnumResource(hEnum,ResourceCount,@NetResource,ResourceSize);
WNetCloseEnum(hEnum);
ListBox1.Items.Clear;
for I := 1 to ResourceCount do
if
(NetResource[i].dwUsage = RESOURCEUSAGE_CONTAINER) then
ListBox1.Items.Add(NetResource[i].lpRemoteName);
end;
عند التنفيذ ستجد أن أسماء حواسب شبكة الاتصال قد ظهرت و يمكن بقليل من الجهد توليف الاظهار بالشكل المطلوب. بذلك أتمنى أن أكون قد أجبت على السؤال و يفضل الرجوع إلى الـ Documentation للحصول على الحل الأمثل، مع تمنياتي بالتوفيق و النجاح.
إضافة تعليق جديد