لطفا طریقه ساخت dll و نحوه ی به کارگیری اون رو در برنامه اصلی توضیح دهید.
LIBRARY "MyMN"
EXPORTS
add
char APIENTRY add(char a,char b)
{
return (a+b);
}
#include <windows.h>
typedef char (APIENTRY *ADD)(char a, char b);
HINSTANCE hDLL = LoadLibrary("MyMN.dll");
if (hDLL != NULL)
{
ADD add = (ADD)GetProcAddress(hDLL, "add");
char c = add(2, 1);
printf("c = %d\n", (int)c);
FreeLibrary(hDLL);
}
سلام جناب علی سعید، ممنون بابت راهنماییتون، آیا برا ساختن فایل DLL احتیاج به هدر نیست؟
تو راهنمایی هایی که MSDN کرده هدر داره، لطفا آدرس زیر را ملاحظه فرمایید:
http://msdn.microsoft.com/en-us/library/ms235636(v=vs.80).aspx
همچنین در DLL از Class استفاده کرده است!
در ضمن وقتی برای ساخت DLL پروژه را انتخاب میکنم وارد win32 dynamic library link میشم و گزینه سوم را انتخاب میکنم که خودش به عنوان نمونه و پیش فرض از Class استفاده کرده است.
بازم ممنون.
لزفا اگه ممکنه ضرورت داشتن فایل def در یک پروژه DLL را بفرمایید، اگر این فایل موجود نباشه، آیا برنامه درست کار نمی کنه؟
ممنون از شما جناب علی سعید، ضمن تبریک عید فطر، خواهشمندم راهنمایی بفرمایید که آیا امکان فراخوانی یک فایل DLL در یک DLL دیگر وجود دارد؟
مثلا یک DLL داریور داری، و نمیتونی از توابعش تو یک برنامه مستقیما استفاده کنی، بنابراین لازمه یک واسط بین این DLL و برنامه اصلی یا نرم افزار اصلی باشه تا بتونه با توجه به محدودیت نرم افزار اصلی، پارامترها را دریافت کنه و متناسب با DLL مورد نظر توابع را فراخوانی کنه و پارامتر بده، و این برنامه واسط هم خودش یک DLL باشه، چطور میشه اینکار را کرد؟
اصلا واضح تر بگم، چون در ویندوز XP امکان استفاده از دستورات _outp() وجود نداره و با XP سازگاز نیست، لازمه که از دریوار inpout32.dll استفاده بشه، اما این درایور توابعش مستقیما از نرم افزار مونیتورینگ اصلی قابل دسترس نیست، لازمه بتونیم یک تابع DLL واسط بنویسیم که در خودش inpout32.dll را بتونه فراخوانی کنه و با نرم افزار ارتباط برقرار کنه، اولا طبق توضیحات بالا آیا امکان فراخوانی یک DLL در DLL دیگر وجود داره؟
اگه نه، در مورد تابع _outp() که یک تابع دسترسی مستقیم هست توضیح بفرمایید که آیا راهی غیر از استفاده از DLL بالا هست که بتونیم ازش استفاده کنیم و مستقیما تو XP جواب بده؟
با تشکر فراوان از شما.
نه، این کد داخل dll نیست که دسترسی به پورت رو محدود کرده، ویندوز XP ئه که موقع اجرا اینکار رو انجام میده، فرقی نمی کنه که محیط کامپایل اون فایل dll کدوم ویندوز باشه.سلام مجدد خدمت شما آقای علی سعید و تشکر بابت راهنمایی های قبلیتون.
میخواستم بپرسم که آیا میشه یک فایل dll در ویندوز 98 یا ME نوشت و بعد اون را در ویندوز XP فراخوانی کرد؟
این را برا این میپرسم که دسترسی به دستورات دسترسی مستقیم به پورت در ویندوز 98 و ME راحت می باشد، مثل دستور _outp()، آیا میشه فایل DLL را در 98 نوشت و از این دستورات استفاده کرد و بعد برد تو ویندوز XP که این دستورات را پشتیبانی نمی کنه استفاده کرد؟
اگه نه استفاده از نرم افزارهایی مانند virtual box که میشه در ویندوز xp ویندوز 98 نصب کرد، آیا این ویندوز 98 دستورات دسترسی مستقیم به پورت را در اختیارمون میزاره؟
و سوال دیگه ای که دارم اینکه، وقتی شبیه دستورات فراخوانی dll ای که شما ارایه کردید برای فراخوانی توابع فایل inpout32.dll استفاده میکنم، جواب نمید
با تشکر مجدد، در استفاده از virtual box دچار مشکل شدم، مشکل هم اینکه به نوع پارتیشن ایراد میگیره، یعنی برا نصب ویندوز me احتیاج به پارتیشن dos داره، اومدم پارتیشن درایو c را fat کردم ولی بازم همون خطا را میده، چیکار باید بکنم؟
در مورد iinpout32.dll هم خدمتتان بگم که ویندوزم 32 بیتی هست و با روشی که خودش فراخونده ارتباط برقرار میشه، اما از روش پیشنهادی جنابعالی استفاده کردم در لود کردن همه فایل های dll مثل kernel.dll و ...ایراد گرفت ولی برنامه اجرا شد اما دیتای درست برنگشت، ضمنا اگه ممکنه طریقه راحت تر و مطمئن تر ارتباط با پورت را توضیح بفرمایید، ممنون میشم.
جناب علی سعید، من اگر بخواهم از همون فایل inpout32.dll به همون روشی که خودش برا ارتباط برقرار کردن استفاده کنم، آیا میتونم تو فایل dll خودم صداش کنم؟
البته خودم اینکار را کردم، در حالت عادی جواب میده، اما موقع فراخوندنش تو فایل dll ای که خودم مینویسم و میخوام تو ی نرم افزار مانیتورینگ فایل خودم را فرابخونم و فایل خودم هم فایل دیگه را فرابخونه به مشکل برخورد میکنه، و به تابع _stdcall() که برای ارتباط با فانکشن های dll ارائه کرده ایراد میگیره و کامپایل نمیکنه، لطفا بنده را راهنمایی نمایید.
ضمنا سوال دیگه هم داشتم که اگر از virtual box استفاده کنم، میتونم برنامه dll را در ویندوز 98 بنویسم و تو وسندوز xp اصلی فراخونیش کنم؟
اینم فکر کنم نشد باشه!!!!!!!!!!!
ممنون از لطف شما.
با سلام خدمت دوست گرامی آقای علی سعید و تشکر از راهنمایی های خوبتون.
مهندس بنده در یک فایل DLL از دستور if استفاده کردم به نحوی که برنامه بعد از دریافت یک int آن را با چند عدد مقایسه میکنه و بعد در هر بازه ای بود یک مقداری را متناسب بر میگردونه، اما این حلقه اصلا اجرا نمیشه، جالب اینجاست که همون برنامه در win consol application به خوبی جواب میده، و حلقه اجرا میشه، اما در فایل DLL انجام نمیشه، لطفا راهنمایی بفرمایید.
برنامه هم مختصر و تابع داخل DLL به این نحو می باشد.
int APIENTERY FUNC(int c)
{
if(0<c)
{
if (c<32)
{
b=0x220;
}
if(c<64)
{
b=0x230;
}
}
return b;
}
حلقه if اصلا اجرا نمیشود.
در مورد if از عبارت حلقه استفاده نکنید، if شرط ئه، بیش از یکبار اجرا نمیشه که حلقه باشه. اگر کدی دیگری می نویسید اجرا میشه پس قطعا if هم اجرا میشه.بله dll کاملا درست نوشته شده، اگر تو تابع FUNC یک برنامه ساده بنویسم که مثلا دو عدد را با هم جمع کنه و نتیجه را برگردونه و یا یک عدد ثابت را برگردونه به درستی کار میکنه، فقط این حلقه انجام نمیشه، با فرض اینکه خروجی FUNC قرار باشه عدد ثابت b=0x220 را برگردونه کاملا درست عمل میکنه و یا مثلا ورودی C را بگیره و با 0x220 جمع کنه و نتیجه را برگردونه درست عمل میکنه، دستورات دیگه از قبیل while و... هم دارم که درست اجرا میشه، فقط حلقه if اجرا نمیشه، حلقه if هم در تابع قرار است، ورودی را بگیره و مقایسه کنه ببینه اگر بین 0 و 32 باشه عدد 0x220 را داخل متغییر b بزاره، اگر بین 32 تا 64 باشه، 0x230 را داخل متغییر b بزاره، اگر بین 64 تا 96 باشه، مقدار 0x240 را در متغییر قرار بده و در جای دیگه متغییر b به عنوان آدرس پایه کارت آیزا استفاده شده ااست.
از لحاظ درست بودن فرمت کلی فایل dll اطمینان کامل دارم و مراحل درست طی شده، فقط این حلقه اجرا نمی شود.
در پایان آیا راه دیگیری غیر از if برای مقایسه دو متغییر int وجود داره ببینم اون اجرا میشه یا نه؟
ممنون.