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

ممكن تصحيح الخطأ اللى فى الكود سى

مغلق
بدأه eng_3llam في 2 يوليو 2005 · 15 رد · 870 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

السلام عليكم

بعد عمل شاق ومجهود وبحث يعنى قدرت أعمل dll بالسى ولكن المشكلة وجود بعض الاخطاء

أرجو تصحيحها من لة خبرة فى هذا المجال

دة كود ال .cpp حيث اسم الdll هو nemodll

#include <windows.h>
#include "nemodll.h"
//int add(int,int);
BOOL APIENTRY DllMain( HANDLE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{
   return TRUE;
}
/**@x, @y**/
  int add(int x,int y)
{

 return x+y;     //return result
}
ودة كود الزdef

[CODE
LIBRARY nemodll
EXPORTS
add



ودة ال.h الازم لتعريف الدوال

/** define external method **/
  int add(int,int);

المشكلة بقى ان فى حالة الbulid يعطى خطأ وهو

unresolved external 'add' refrenced from root

مع انى معرفها ف ال.def

وعند كتابة هذا السطر قبل الدالة الجمع

extern "C"

مع ذلك يعطى نفس الخطأ مع العلم انة يبنشأ الdll بس اللى انا عاوز اعرفة لية الخطأ دة ؟؟؟؟

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#2

ادى المشروع

dll_in_c__.rar

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#3

؟؟؟ No Reply

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#4

بصراحة قرأءة الكود وشغلته على البورلاند سى

لايعمل بسبب ان البورلاند لا يدعم مكتبة windwos .h

اما الخطاء الثانى :

BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)

هذا ليس رايى

هذا راى البورلاند سى

_____________________________

C Language && Windwos_API

_____________________________

#5

"لايعمل بسبب ان البورلاند لا يدعم مكتبة windwos .h"

ياراااااااااجل حرام ليك مين اللى قلك كدة ؟؟؟

انا بقالى سنة ونصف بأستخدم هذا الheader file فى السى بلس على البورلاند

أخى هل انت قراءت السؤال جيدا ام لا

BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved

دة الentery point of dll

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#6

حملت الملف ورح اشوف .. لكن هل عمل ملف DLL في برامج الويندوز نفس برامج الكونسل .. اذا كان كذا الامر سهل ..

رح احاول اعمل شي لكن ماهو وعد : )

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#7

أخى الشمرى ممكن توضح كلامك ؟؟؟؟؟؟؟

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#8

اعتقد والله اعلم ان كلمة add محجوزه للمعالج حاول تغيرها واكتب مثلاُ sum وجرب, طبعاً انا مش متاكد ولكن باقى الكود شكله مظبوط...

تعديل:

لاتنسى ان تضع حجم المتغيرات مثلاُ انت تستخدم int وكل int حجمه يساوى 4 بايت يعنى المجموع يساوى 8 بايت

LIBRARY nemodll
EXPORTS
sum@8

تم تعديل هذه المشاركة بواسطة احمد غريب في 3 يوليو 2005 في 23:58

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#9

أشكرك أخى احمد وسوف أجربة الان بعد كتابة هذة الرسالة

"sum@8"

كل اللى انا أعرفة عن @

ان انا عامل دالة هذة الدالة تكون مستعارة بمعنى

ان مثلا هى الدالة add ممكن أخلى المبرمج اللى هيشتغل بهذة الدالة بدل ما يستخدمها بadd لا اخلية يستخدمها عن طريق كلمة sum

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#10

السلام عليكم

لا لا اخى انت فهمتنى غلط, ما قصدته هو التالى,, لا تستخدم كلمة add إطلاقاً لانها قد تكون محجوزه, انا لا اعرف بالنسبه للسى بلس بلس ولكن هى محجوزه فى الاسمبلى لذلك قد تسبب لك بعض المشاكل..

اما بالنسبه لعلامة @ فهى بإختصار توضع قبل عدد البايتات التى تاخذها الداله يعنى مثلاً لو كانت الداله تاخذ 4 int إذاً لابد ان نكتب sum@16 وبذلك يعرف يستطيع الكمبايلر معرفة عدد المعطيات قبل ان يستدعى الداله.

ارجو ان اكون قد وضحت المسئله

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#11

أة على فكرة أخى احمد أنا نسيت أقولك ان انا غيرت برضة اسم الدالة الى sum ومع ذالك يعطى نفس الخطأ

ومش عارف احلة اما عن طريق الhelp

او تحليل الكود

أرجو الافادة

وشكرا كلم

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#12

حملت برنامجك وجربته .. طبعا لم افتح المشروع كامل لانك مسويه بالبورلاند .... فاخذت الكود اللي سويته وعملت له كومبايلر وطلع برنامجك مظبوط 100% ولايوجد اي خطأ !!!

الخطأ ليس من الكود انما من شي اخر ..

المشكلة ان البورلاند تختلف عن الفيجوال .

بالفيجوال سي ..

افتح مشروع جديد واختار

win32 dynamic-link-libraryواختر ملف فاضي....

وضع هالكود

#include "windows.h"


BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
      )
{

    return TRUE;
}

وهي نقطة بداية الملف ....

طبعا تعلن عن الدوال التي تريدها لكن تسبقها بي:

extern "C" __declspec(dllexport)

وانا رأيتك .. تكتب فقط

extern "C"

لا اعلم هل البورلاند يطلب ذلك ..

ثم بعد ان تعلن عن الدوال التي تريد .. خارج الدالة الرئيسية ..

تضغط f7 او تذهب الى القائمة build وتختار منها build xxxx.dll

واذهب الى مجلد برنامجك ثم الى ملف debug ويجد ملف dll وملف lib الخاصة بالبرنامج ...

وبالمرفقات مثال بسيط ..

يوضح المطلوب.. وعمل بشكل سليم .لكن لم اجرب واستدعيه .... رح اجرب واذا طلع خطأ ارد عليكم .

المهم يا اخ eng_3llam

انتبه للمشروع اللي اخترته وابحث عن مشروع مشابه ... وانظر كيف يمكنك .. عمل build لملف dll .. واما الكود اللي كاتبه صحيح ..

-------------

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#13

اشكرك على ردك ياأخ شمرىوأشكر الاخ أحمد غريب وعلى العموم انا خلاص سيبت البورلاند وأنتقلت الى الفيجوال سى

"extern "C" __declspec(dllexport)"

ممكن شرح الجملة دى بتفصيل شوية

كل اللى انا اعرفة هى كلمة exten

ومعناها ان الدالة دى متعرفة فى مكان تانى

أما الباقى فالله أعلم D:

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#14

السلام عليكم

انا زرت الموضوع دا من فتره ومش فاكر انا رديت عليه إمتا بالظبط على كل حال انا اشرح لك الحرف C لكن الباقى اعتقد له علاقه بالفشول سى, ويمكنك مراجعه ملفات الhelp فى الفشوال..

على كل حال هناك ثلاث طرق لإستدعاء الدوال النوع الاول إسمه C , النوع الثانى إسمه pascal والنوع الثالث إسمه stdcall وهى ثلاث طرق لإستخدام المكدس وتسمية الدوال,على سبيل المثال طريقة السى تعتمد على تغير إسم الداله بحيث انه إذا سمينا داله Test فإنها تصدر Export بإضافة خط اسفل الداله على النحو التالى Test_ كذلك تحتفظ طريقة السى بالحروف الكبيره والصغيره دون تغير, اما الpascal تحول جميع الحروف إلى حروف كبيره على النحو التالى TEST وهكذا, اما بالنسبه للمكدس فعلى ما اذكر هو ان طريقة الC المسؤل عن توازن المكدس هو الداله المستدعيه, اما فى طريقة الpascal فالداله المستداعاه هى المسؤله عن توازن المكدس والطريقه الاخيره stdcall فهى خليط بين الاثنين... هذا طبعاً بإختصار وإذا كان الامر يهمك وتعرف كيف يعمل المكدس فيمكنك طرح اسئله وإن شاء الله اشرح لك بالتفصيل...

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#15

انا ماعرف بالظبط وش تعمل هالكلمات .. لكن كما قال الاخ احمد .. اعتقد انها محجوزة للفيجوال سي فقط ..

اللي اعرفه ان

dllexport تستخدمها لما تريد انتاج ملف dll ..

اما

dllimport اذا ما غلطت بالكلمة .. فنستخدمها اذا اردنا قراءة دالة ما من ملف dll ... طبعا منتج بالسي ...

جربت مثال ونجحت .. لكن هي فيها كم لفة .. عندي درس ممتاز يعلمك خطوة بخطوة .. اذا ما نسيت رح ارفعه .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#16

شكرا لكم

وأرجو من الاخ أحمد التوضيح أكثر أو أعطأ لينكة للتعمق فى هذا

والاخ الشمرى ياريت لو تضع هذة اللينكة للافادة

وشكرا لكم

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

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

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