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

سؤال في لغة سي وبرمجة الوندوز

بدأه newahmed في 25 ديسمبر 2008 · 17 رد · 1,111 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

سؤالي بخصوص دوال الوندوز API هل يمكن استدعاءها من خلال لغة C التي تعمل على الدوز او الوندوز وليس C++

ارجو ممن لديه الاجابة وضع طريقة ادراج الدالة مع الشكر الجزيل

#2

في الأصل دوال API في أمثلة مايكروسوفت جميعها على c وليس c++

وهذا مثال بسيط:

  1. #include<windows.h>
  2. #include<stdio.h>
  3. int main()
  4. {
  5. printf("This is Message Box API");
  6. MessageBox(NULL,L"Hello",L"arabteam2000",0);
  7. return 0;
  8. }
  9.  

tvquran_6.gif

#3

وهل يمكن استخدام دوال API من خلال التيربو سي++ 3

دولة الخلافة الاسلامية في المخاض الاخير وميلادها قريب

حزب التحرير : التزم الطريق الصحيح الشرعي الوحيد لاعادة دولة الخلافة الاسلامية .

الامة الاسلامية متعطشة لقيادة مخلصة لتذوق حلاوة النصر ولن يكون ذلك الا بعودة الخلافة الاسلامية

الامة الاسلامية تحتاج لاحداث تسحقها سحقا وتمعسها معسا لتفكر تفكيرا جماعيا بالتغير لان وحدة المشاعر لوحدها لاتكفي وهذة الاحداث كلها خير

#4

كل دوال API هي في الواقع على السي

السي ++ يستخدم مكتبة MFC لأنها OOP أما API فهي ليست API لهذا يمكنك إستعمالها على السي وكذلك بالنسبة أعتقد للتيربوا س++

#5

لم أجربها مع التيربو سي لكن أحتمال كبير ان لا تعمل عليه.

اذا عملت على التيربو أخبرنا بذلك لنعرف.

tvquran_6.gif

#6

دوال API يمكن استدعاءها من أي لغة C/C++/ASM/Delphi/Basic/..etc طالما لديك التعريف الصحيح .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#7

من الممكن!

لكن الذي دفعني للشك في عملها ان التيربو قديم يعمل على دوس أصلا قبل الويندوز.

ودوال API هي اصلا دوال نظام الويندوز.

tvquran_6.gif

#8

السلام عليكم ,,

اقتباس
دوال API يمكن استدعاءها من أي لغة C/C++/ASM/Delphi/Basic/..etc طالما لديك التعريف الصحيح .

كما قال الأخ GM, طالما أن مترجمك يقوم بإنتاج ملفات تنفيذية لـ Windows فتستطيع مناداة Windows API,

إذا كان مترجمك لا يدعم إنتاج ملفات تنفيذية لـ Windows فلن تستطيع ذلك :)

تحياتي ,,

#9

ولكن تذكروا جميعا أن ملفات exe المنتجة من التيربو سي++ 3 هي في وضع الـ16 بت والويندوز له الضعف

دولة الخلافة الاسلامية في المخاض الاخير وميلادها قريب

حزب التحرير : التزم الطريق الصحيح الشرعي الوحيد لاعادة دولة الخلافة الاسلامية .

الامة الاسلامية متعطشة لقيادة مخلصة لتذوق حلاوة النصر ولن يكون ذلك الا بعودة الخلافة الاسلامية

الامة الاسلامية تحتاج لاحداث تسحقها سحقا وتمعسها معسا لتفكر تفكيرا جماعيا بالتغير لان وحدة المشاعر لوحدها لاتكفي وهذة الاحداث كلها خير

#10
اقتباس
ولكن تذكروا جميعا أن ملفات exe المنتجة من التيربو سي++ 3 هي في وضع الـ16 بت والويندوز له الضعف

للأسف خبرتي ضعيفة جداً في برمجة الويندوز :S

و لكني أعتقد أن windows يستطيع تشغيل البرامج الموجهة لـ MS-DOS عن طريق المحاكاة.

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 25 ديسمبر 2008 في 21:02

#11
اقتباس
و لكني أعتقد أن windows يستطيع تشغيل البرامج الموجهة لـ MS-DOS عن طريق المحاكاة

ولكن المطلوب هو العكس أخي الكريم

دولة الخلافة الاسلامية في المخاض الاخير وميلادها قريب

حزب التحرير : التزم الطريق الصحيح الشرعي الوحيد لاعادة دولة الخلافة الاسلامية .

الامة الاسلامية متعطشة لقيادة مخلصة لتذوق حلاوة النصر ولن يكون ذلك الا بعودة الخلافة الاسلامية

الامة الاسلامية تحتاج لاحداث تسحقها سحقا وتمعسها معسا لتفكر تفكيرا جماعيا بالتغير لان وحدة المشاعر لوحدها لاتكفي وهذة الاحداث كلها خير

#12

شكراً جزيلا اخي فهد على مساعدتك.. جربت الكود ولم يعمل في البداية وعند حذف حرف L من الدالة عملت معي مضبوط :hmm: علماً اني استخدمturbo C++ under windows من borland

وبالنسبة لموضوع النقاش فقد جربت نفس الكود علىturbo C++ under DOS ايضاً من borland ولكنها لم تعمل بسبب عدم وجود الملف الرئسي winsows.h

اعتقد انها ممكن تعمل لو وضعنا طريقة التعريف الصحيحة كما قال الاخGamingMaster لأنها مجرد استدعاء لدوال الوندوز..

ولكم جزيل الشكر

#13

جميل جدا كمبايلر بور لاند تيربو رغم انه معمر إلا انه يعمل جيدا.

tvquran_6.gif

#14

صحيح اخي فهو الحل للكثير من المشاكل في معظم الاوقات.. ;)

أما بالنسبة للكود السابق الذي قمت بوضعه فأعتقد ان دالة messagebox قد ضمنت ضمن الملف الرأسي windows.h .. اي بطريقة مشابهة لما يتم حالياً العمل به في بيئة الفريم ورك حيث يتم محاكاة دوال الـAPI عن طريق دوال الفريم وورك نفسه مما يضيف قوة وسهولة.. ولكن ايضاً هذا يحتوي جانب سيء (حسب وجهة نظري المتواضعة) حيث اني سأضطر إلى البحث عن كل دالة من دوال الوندوز وايجاد الملف الرأسي المناسب لها :wacko: مما يجعل العملية صعبة اضافة إلى تضمين هذه المكتبات عند بناء البرنامج وهذا الأمر المزعج اكثر.. :mad:

هل من طريقة للحصول على مقبض الدالة فقط لدالة معينة حيث كنت اعمل هذا قديماً في الفجول بيسك6 وهذا نموذج يوضح ما اقصد

Private Declare Function GetTickCount Lib "Kernel32" () As Long

Private Sub Command1_Click()
Print Format(GetTickCount / 10000 / 6, "0")
End Sub

وأعتقد ان الكود واضح ولا يحتاج إلى شرح حيث قمت بتضمين تعريف لدالة الوندوز (مع المتغيرات ان وجدت) وايضاً نوع القيمة المعادة من الدالة واستدعاءها داخل البرنامج بكل بساطة B)

فهل يمكن عمل هذا الشيء بلغة turbo C؟؟ :rolleyes:

#15
  1.  
  2. /* includes */
  3. #include <Winbase.h>
  4. ////////////////////////
  5. /* Code to show how to use this function GetTickCount */
  6. dwOldTime = GetTickCount();
  7. DoSomething();
  8. dwTimeElapsed = GetTickCount() – dwOldTime;
  9.  

صراحة أنا لم أفهم تماما ما تريد ان تقوله ، لكن أردت الإفادة بأى شكل من الأشكال

#16

شكراً لتفاعلك اخ عمر..

ما اريده بالضبط هو عدم تحميل الملف الرأسي headerfile ثم استدعاء الدالة الموجودة فيه والتي تقوم بدورها بإستدعاء دالة الـAPI لأني لا اريد تضمين جميع مكتبات السي في البرنامج الذي اريد عمله هذا اولأً وثانياً لأني لا اعرف بالضبط ضمن اي header توجد الدالة التي اريد استخدامها.. فمن غير المعقول ادراج مكتبة windows.h كاملة فقط لأنني احتاج لإستدعاء دالة messagebox او ادراج مكتبة winbase.h كاملة فقط لأني اريد استدعاء دالة gettickcount .. لأنك كما تعلم عند بناء البرنامج فإنه سيقوم بتضمين جميع هذه المكتبات المستخدمة وهذا هو الشيء الذي لا ارغب بالوصول إليه..

بمعنى اخرى اريد طريقة تعريف دالة الـAPI داخل السي واستخدامها مباشرة كما يحدث في لغة الفجول بيسك6..

اتمنى ان تكون الفكرة وصلت..

#17

يبدو ان الموضوع التبس عليك أخي الكريم ...

هناك فرق بين اضافة مكتبة للتعاريف HeaderFile وبين الربط بمكتبة ديناميكية او ستاتيكية .

عند اضافة ملف التعاريف windows.h فأنت تقوم باضافة التعاريف فقط لكن يمكنك تحديد أي المكتبات DLL سيتم ربط البرنامج بها عن طريق خيارات الـLinker .

عموما يمكنك استدعاء الدالة دينامكيا عن طريق LoadLibrary/GetProcAddress .

اليك مثال على MessageBox :

[color= #0000ff;]int

[color= #000000;](WINAPI [color= #000000;]*MsgBox[color= #000000;])[color= #000000;](

    __in_opt HWND hWnd,

    __in_opt LPCSTR lpText,

    __in_opt LPCSTR lpCaption,

    __in UINT uType[color= #000000;]);

 

[color= #0000ff;]int main[color= #000000;]([color= #000000;])

[color= #000000;]{

    [color= #000000;]*[color= #000000;](FARPROC[color= #000000;]*[color= #000000;])[color= #000000;]&MsgBox [color= #000000;]= GetProcAddress[color= #000000;](LoadLibrary[color= #000000;](TEXT[color= #000000;]([color= #A31515;]"user32.dll"[color= #000000;])[color= #000000;]), [color= #A31515;]"MessageBoxA"[color= #000000;]);

    [color= #0000ff;]if [color= #000000;](MsgBox [color= #000000;]![color= #000000;]= NULL[color= #000000;]) [color= #000000;]{

        MsgBox[color= #000000;](NULL, [color= #A31515;]"This routine is called dynamically", [color= #A31515;]"MessageBox", MB_OK[color= #000000;]);

    [color= #000000;]};

    system[color= #000000;]([color= #A31515;]"pause"[color= #000000;]);

[color= #000000;]};

تم تعديل هذه المشاركة بواسطة GamingMasteR في 27 ديسمبر 2008 في 22:16

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#18

شكراً اخي GameMaster هذا ما قصدته بالضبط الربط الديناميكي للدالة فقط وشكراً لأنك وضحت لي هذه النقطة..

لقد قمت بتجربة الكود السابق على Borland C++ Under Windows وظهرت بعض الاخطاء ، سأحاول معرفة الخطأ إن شاء الله ووضع الكود الصحيح..

لقد اعتقدت لوهلة أن هذه الطريقة لاتعمل في لغة الـC وقد أعاد لي مثالك الأمل من جديد :clapping:

تم تعديل هذه المشاركة بواسطة newahmed في 28 ديسمبر 2008 في 16:10

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