الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

اريد كود يعرفني ان البرنامج مثبت بالجهاز ام لا

مغلق
بدأه yasserstars في 31 ديسمبر 2007 · 9 رد · 1,113 مشاهدة · في لغة Ms Visual Basic 6 وما قبلها من إصدارات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

اريد كود يعرفني ان البرنامج مثبت بالجهاز ام لا

يعني اريد عمل برنامج يعرفني هل برنامج مثل الأكسيس مثبت بالجهاز ام لا او الفيجول مثلا او الورد او برنامج النورتن مثلا

ارجو التوضيح مع شرح الكود ان امكن

#3
yasserstars كتب:
اريد كود يعرفني ان البرنامج مثبت بالجهاز ام لا

يعني اريد عمل برنامج يعرفني هل برنامج مثل الأكسيس مثبت بالجهاز ام لا او الفيجول مثلا او الورد او برنامج النورتن مثلا

ارجو التوضيح مع شرح الكود ان امكن

hazzoom كتب:
أنت تحتاج الي WMI.. يمكن أن يتفضل أحد الأخوة ويزدوك بمثال ,,,

أتمني أن يفيدني أحد

#4

الأخ الفاضل ...

بالإضافة إلى ماذكره الأخ hazzoom يمكنك فحص الـ Registry فى العنوان التالى

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall]

فغالباً عند تثبيت برنامج يقوم برنامج التثبيت بوضع Key (يحتوى بيانات "مثل الأسم - الإصدار - تاريخ التثبيت - المسار ... الخ" ليمكن إزالت Uninstall البرنامج فيما بعد إذا تطلب ذلك)، ويقوم بإزالت هذا الـ Key عند إزالت البرنامج، فيمكنك فحص بيانات هذا الـ Key من مسجل النظام Registry وفحص قيمة DisplayName مثلاً

فمثلاً :

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft SQL Server 2000]
"DisplayName"="Microsoft SQL Server 2000"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft SQL Server 2005]
"DisplayName"="Microsoft SQL Server 2005"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Visual Studio 6.0 Enterprise Edition]
"DisplayName"="Microsoft Visual Studio 6.0 Enterprise Edition"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{90110409-6000-11D3-8CFE-0150048383C9}]
"DisplayName"="Microsoft Office Professional Edition 2003"
"DisplayVersion"="11.0.7969.0"

شكراً

تم تعديل هذه المشاركة بواسطة Eng. Usama El-Mokadem في 1 يناير 2008 في 11:27

Eng. Usama El-Mokadem

Nothing is impossible, the word impossible itself says that: I M - Possible

#5

أشكرك أخي أسامة

وارجو منك ان توضحها ببرنامج لان الكود مش عارف أوظفة

#6

السلام عليكم

افتح مشروع جديد واضف Command1 & List1

هذا هو ترجمة ما قاله الأخ أسامة الى كود

Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" ( _
	ByVal hKey As Long, _
	ByVal lpSubKey As String, _
	phkResult As Long) As Long
Private Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias "RegEnumKeyExA" ( _
	ByVal hKey As Long, _
	ByVal dwIndex As Long, _
	ByVal lpName As String, _
	ByRef lpcbName As Long, _
	ByVal lpReserved As Long, _
	ByVal lpClass As String, _
	ByRef lpcbClass As Long, _
	ByRef lpftLastWriteTime As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" ( _
	 ByVal hKey As Long, _
	 ByVal lpValueName As String, _
	 ByVal lpReserved As Long, _
	 ByRef lpType As Long, _
	 ByRef lpData As Any, _
	 ByRef lpcbData As Long) As Long

Const HKEY_LOCAL_MACHINE = &H80000002
Const ERROR_NO_MORE_ITEMS = 259&

Private Sub Command1_Click()
Dim hKey As Long, Cnt As Long, Ret As Long, lpName As String
Dim ChildKey As Long, lpData As String, strValueName As String, iRet As Long

strValueName = "DisplayName"
If RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", hKey) = 0 Then
	List1.Clear
	lpName = Space(255)
	Ret = 255
	While RegEnumKeyEx(hKey, Cnt, lpName, Ret, ByVal 0&, vbNullString, ByVal 0&, ByVal 0&) <> ERROR_NO_MORE_ITEMS
		RegOpenKey HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" & Left$(lpName, Ret), ChildKey
		lpData = Space(255)
		iRet = 255
		RegQueryValueEx ChildKey, strValueName, 0, 0, ByVal lpData, iRet
		RegCloseKey ChildKey
		If iRet <> 255 Then
			List1.AddItem Left$(lpData, iRet), 0
		Else
			List1.AddItem Left$(lpName, Ret), 0
		End If

		Cnt = Cnt + 1
		Ret = 255
		lpName = Space(255)
	Wend
End If
RegCloseKey hKey
End Sub

Private Sub List1_DblClick()
MsgBox List1.Text
End Sub

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#7

فقط أردت أن أضيف نقطة هنا مهمة

في معظم الأحيان عند تثبيت الMS Office قد لا أثبت الأكسس معه لذلك هذا لا يعني أن الأكسس موجود بالضرورة أو الباوربونت

يمكننا أن نبحث عن البرنامج الذي يقوم بفتح هذا النوع من الملفات مثلا الmdb للأكسس باستعمال الريجيستري دائما. نبحث في المسار

HKEY_CLASSES_ROOT\.mdb اذا وجدنا OpenWithList يعني أنه يوجد برنامج يفتح هذا الامتداد نتأكد من أنه يوجد مجلد تحته هو ميكروسفت أكسس

بالتوفيق للجميع

#8

أشكركم جميعا أخواني الكرام وارجو من الأخ GamingMasteR توضيح شرح الكود

فالكود نجح بالفعل ولكني اريد أفهم الكود ان أمكن ذلك

والف شكر مرة أخري

#9

السلام عليكم

If RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", hKey) = 0 Then

نقوم بانشاء مقبض لمفتاح الرجستري SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall ونخزن المقبض في hKey كي نستخدمه لاحقا

lpName = Space(255)
	Ret = 255

نقوم بانشاء بفر كي نقرأ فيه اسماء المفاتيح المتفرعة من SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall بحجم 255 بايت

Ret تستخدم كصول للبفر في الدوال القادمة

While RegEnumKeyEx(hKey, Cnt, lpName, Ret, ByVal 0&, vbNullString, ByVal 0&, ByVal 0&) <> ERROR_NO_MORE_ITEMS

دالة تقوم بعمل جرد للـSubkeys :

hKey:المقبض الذي حصلنا عليه من قبل

Cnt: هو اندكس Index او ترتيب الـsubkey الذي نريد جلب بياناته ونبدأ من 0 مع زيادة العداد في كل مرة الى ان تعود الدالة بالقيمة ERROR_NO_MORE_ITEMS فنكون قد انتهينا من عملية الجرد

lpName: هو البفر او المساحة التي سيتم تخزين اسم المفتاح فيها مثل "Acrobat Reader" مثلا

Ret : طول البفر السابق ... بعد اتمام الدالة تتغير الى طول اسم المفتاح

RegOpenKey HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" & Left$(lpName, Ret), ChildKey

نقوم بفتح مقبض للـsubkey لقراءة محتوى القيمة DisplayName

		RegQueryValueEx ChildKey, strValueName, 0, 0, ByVal lpData, iRet
		RegCloseKey ChildKey

دالة تقرأ محتويات قيمة معينة (هي DisplayName في حالتنا) في مفتاح معين (SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Acrobat Reader مثلا)

وتخزنه في lpData وطول النص في iRet

بعد ذلك نغلق المقبض لأننا لن نستعمله مرة اخرى

If iRet <> 255 Then
			List1.AddItem Left$(lpData, iRet), 0
		Else
			List1.AddItem Left$(lpName, Ret), 0
		End If

في بعض الأحيان لا تقوم البرامج بعمل القيمة DisplayName في مفتاحها الخاص ... عند ذلك سيظل iRet يحمل القيمة الاصلية له 255 ولذلك نقوم بعرض اسم المفتاح , اما اذا كان هناك القيمة DisplayName فان طول محتواها سيرجع في iRet ونقوم بعرضه بدلا من اسم المفتاح لاحظ :

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{90110409-6000-11D3-8CFE-0150048383C9}]
"DisplayName"="Microsoft Office Professional Edition 2003

"

مفتاح البرنامج هو {90110409-6000-11D3-8CFE-0150048383C9} لكن اسمه الفعلي Microsoft Office Professional Edition 2003

Cnt = Cnt + 1
		Ret = 255
		lpName = Space(255)

نقوم بزياده عداد الاندكس الذي يستخدمه الدالة RegEnumKeyEx واعادة Ret الى 255 مع اعادة تهيئة البفر

RegCloseKey hKey

نغلق مقبض المفتاح الرئيسي بعد ان انتهينا منه

بالتوفيق

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#10

ألف شكر أخي العزيز

وجزاك الله كل خير

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…