طریقه ساخت dll در C++

the_king

مدیرکل انجمن
لطفا طریقه ساخت dll و نحوه ی به کارگیری اون رو در برنامه اصلی توضیح دهید.

برای نحوه ساختن DLL رجوع شود به :

استفاده از dll تولید شده در c++ واستفاده از ان در c#

dll به زبان C++

درخواست کد برای خواندن تایتل در ++c

برای فراخوانی DLL در برنامه رجوع شود به :

مشکل:کدdllدر فراخوانی یک تابع در برنامه اصلی

استفاده از فایل dll در برنامه VC++
 

ariyan321

New Member
سلام، بنده رفتم یک dll با استفاده از MSDN نوشتم، اما error داد.
فایل هدر را به این ترتیب نوشتم:
#ifdef MN_EXPORTS
#define myMN __declspec(dllexport)
#else
#define myMN //__declspec(dllimport)*/
#endif


// This class is exported from the mn.dll
class myMN add {
public:


add(char a,char b);




};



و فایل ccp را هم به این ترتیب نوشتم:

// mn.cpp : Defines the entry point for the DLL application.
//


#include <stdafx.h>
#include "mn.h"
#include <iostream.h>
#include <string.h>


int c;


extern "C"
{
myMN char add(char a,char b)
{

return (a+b);
}


}
و برنامه ای را هم به وسیله win32 console application نوشتم که بتونم فایل dll ام را امتجان کنم، برنامه از این قرار هست:

#include <iostream.h>
#include <string.h>
#include "mn.h"
#include <conio.h>
#include "StdAfx.h"






void main()
{
char c=myMN::addd(2,1);


}
قابل ذکر است که همه فایل های پوشه debug پروژه dll vh به فایلهای debug پروژه ای که dll را در آن فرا میخوانم کپی میکنم و خود فایل dll را هم در system32 ویندوز هم کپی میکنم، اما باز هم خطا میدهد، خطای آن هم به این ترتیب می باشد:

--------------------Configuration: newcon - Win32 Debug--------------------
Compiling...
2.cpp
D:\visual c+\newcon\2.cpp(11) : error C2440: 'initializing' : cannot convert from 'class addd' to 'char'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
Error executing cl.exe.


newcon.exe - 1 error(s), 0 warning(s)

قابل ذکر است که کامپایلر بنده ویژوال سی پلاس پلاس 6 می باشد، لطفا بنده را راهنمایی فرمایید، چون شدیدا به کمک احتیاج دارم.
با تشکر.
 

the_king

مدیرکل انجمن
گمون نکنم MSDN طوری راهنمایی کرده باشه که در DLL کلاس بسازید، در DLL تون تابع مستقل پیاده سازی کنید، نه کلاس.
برای ساختن یک پروژه DLL در Microsoft Visual C++ 6.0 ساده ترین راه حل رو توضیح داده ام، ساده تر از MSDN
به اون تاپیک هایی که قبلا اشاره شده رجوع کنید. کل چیزهایی که باید بنویسید سه خط در فایل def ای که خودتان می سازید :
کد:
LIBRARY "MyMN"
EXPORTS
add
و سه خط کدی که در فایل cpp اصلی پروژه اضافه می کنید :
کد:
char APIENTRY add(char a,char b)
{
	return (a+b);
}

این پروژه که کامپایل بشه DLL ساخته شده.

در پروژه مثال تون هم اول در StdAfx.h این رو include کنید :
کد:
#include <windows.h>

و در cpp اصلی هم اول تابع رو قبل از main تعریف کنید :
کد:
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);
	}

مثال پیوستی مشابه کاری است که شما باید انجام بدید :
مشاهده پیوست MyMN.zip
 

ariyan321

New Member
سلام جناب علی سعید، ممنون بابت راهنماییتون، آیا برا ساختن فایل DLL احتیاج به هدر نیست؟
تو راهنمایی هایی که MSDN کرده هدر داره، لطفا آدرس زیر را ملاحظه فرمایید:
http://msdn.microsoft.com/en-us/library/ms235636(v=vs.80).aspx

همچنین در DLL از Class استفاده کرده است!
در ضمن وقتی برای ساخت DLL پروژه را انتخاب میکنم وارد win32 dynamic library link میشم و گزینه سوم را انتخاب میکنم که خودش به عنوان نمونه و پیش فرض از Class استفاده کرده است.
بازم ممنون.
 

ariyan321

New Member
لزفا اگه ممکنه ضرورت داشتن فایل def در یک پروژه DLL را بفرمایید، اگر این فایل موجود نباشه، آیا برنامه درست کار نمی کنه؟
 

the_king

مدیرکل انجمن
سلام جناب علی سعید، ممنون بابت راهنماییتون، آیا برا ساختن فایل DLL احتیاج به هدر نیست؟
تو راهنمایی هایی که MSDN کرده هدر داره، لطفا آدرس زیر را ملاحظه فرمایید:
http://msdn.microsoft.com/en-us/library/ms235636(v=vs.80).aspx

همچنین در DLL از Class استفاده کرده است!
در ضمن وقتی برای ساخت DLL پروژه را انتخاب میکنم وارد win32 dynamic library link میشم و گزینه سوم را انتخاب میکنم که خودش به عنوان نمونه و پیش فرض از Class استفاده کرده است.
بازم ممنون.

برای ساختن DLL نه، مربوط به استفاده از DLL ئه. وقتی شما در DLL تون چیزی رو پیاده سازی می کنید پیاده سازی ذاتا شامل تعریف هم میشه.
اما هر ساختار یا تابعی که شما داخل DLL تون تعریف کنید، بیرون از DLL باید مجددا تعریف بشه وگرنه برای کامپایلر مفهوم نیست و قابل دسترسی نخواهد بود،
حالا یا برایش هدر مستقل تعریف می کنید یا اینکار رو نمی کنید و داخل همون کد تون تعریف اش می کنید.

لزفا اگه ممکنه ضرورت داشتن فایل def در یک پروژه DLL را بفرمایید، اگر این فایل موجود نباشه، آیا برنامه درست کار نمی کنه؟

اون فایل def میگه که اسم کتابخانه چیه و کدوم توابع از بیرون از DLL قابل دسترسی اند. حذف اش که بکنید بصورت پیشفرض هیچکدوم از توابع از بیرون قابل دسترسی نیستند.
استفاده از فایل def فقط یکی از روشها است، اما نسبت به بقیه روش ها از بقیه ساده تر و جمع و جور تره.
 

ariyan321

New Member
ممنون از شما جناب علی سعید، ضمن تبریک عید فطر، خواهشمندم راهنمایی بفرمایید که آیا امکان فراخوانی یک فایل DLL در یک DLL دیگر وجود دارد؟
مثلا یک DLL داریور داری، و نمیتونی از توابعش تو یک برنامه مستقیما استفاده کنی، بنابراین لازمه یک واسط بین این DLL و برنامه اصلی یا نرم افزار اصلی باشه تا بتونه با توجه به محدودیت نرم افزار اصلی، پارامترها را دریافت کنه و متناسب با DLL مورد نظر توابع را فراخوانی کنه و پارامتر بده، و این برنامه واسط هم خودش یک DLL باشه، چطور میشه اینکار را کرد؟
اصلا واضح تر بگم، چون در ویندوز XP امکان استفاده از دستورات _outp() وجود نداره و با XP سازگاز نیست، لازمه که از دریوار inpout32.dll استفاده بشه، اما این درایور توابعش مستقیما از نرم افزار مونیتورینگ اصلی قابل دسترس نیست، لازمه بتونیم یک تابع DLL واسط بنویسیم که در خودش inpout32.dll را بتونه فراخوانی کنه و با نرم افزار ارتباط برقرار کنه، اولا طبق توضیحات بالا آیا امکان فراخوانی یک DLL در DLL دیگر وجود داره؟
اگه نه، در مورد تابع _outp() که یک تابع دسترسی مستقیم هست توضیح بفرمایید که آیا راهی غیر از استفاده از DLL بالا هست که بتونیم ازش استفاده کنیم و مستقیما تو XP جواب بده؟
با تشکر فراوان از شما.
 

the_king

مدیرکل انجمن
ممنون از شما جناب علی سعید، ضمن تبریک عید فطر، خواهشمندم راهنمایی بفرمایید که آیا امکان فراخوانی یک فایل DLL در یک DLL دیگر وجود دارد؟
مثلا یک DLL داریور داری، و نمیتونی از توابعش تو یک برنامه مستقیما استفاده کنی، بنابراین لازمه یک واسط بین این DLL و برنامه اصلی یا نرم افزار اصلی باشه تا بتونه با توجه به محدودیت نرم افزار اصلی، پارامترها را دریافت کنه و متناسب با DLL مورد نظر توابع را فراخوانی کنه و پارامتر بده، و این برنامه واسط هم خودش یک DLL باشه، چطور میشه اینکار را کرد؟
اصلا واضح تر بگم، چون در ویندوز XP امکان استفاده از دستورات _outp() وجود نداره و با XP سازگاز نیست، لازمه که از دریوار inpout32.dll استفاده بشه، اما این درایور توابعش مستقیما از نرم افزار مونیتورینگ اصلی قابل دسترس نیست، لازمه بتونیم یک تابع DLL واسط بنویسیم که در خودش inpout32.dll را بتونه فراخوانی کنه و با نرم افزار ارتباط برقرار کنه، اولا طبق توضیحات بالا آیا امکان فراخوانی یک DLL در DLL دیگر وجود داره؟
اگه نه، در مورد تابع _outp() که یک تابع دسترسی مستقیم هست توضیح بفرمایید که آیا راهی غیر از استفاده از DLL بالا هست که بتونیم ازش استفاده کنیم و مستقیما تو XP جواب بده؟
با تشکر فراوان از شما.

فراخوانی یک DLL در یک DLL دیگه فرقی با فراخوانی DLL در هر کد دیگه ای نداره، در ++C روال مشخصی داره که نمونه کد اش رو قبلا قرار دادم. همون رو در کد DLL تون می توانید بکار ببرید.
در ویندوز XP و نسخه های بالاتر دسترسی مستقیم به پورت ها و سخت افزار ها عملی نیست مگر برای نرم افزار های نزدیک به هسته سیستم عامل، مثلا درایور ها.
از همون DLL های واسطه آماده ای که برای اینکار موجود هستند استفاده کنید بهتره تا اینکه وقت صرف نوشتن یک درایور بکنید اما به هر حال شیوه نوشتن اینجور کد ها مشخصه :

Direct Access I/O Ports under Win NT/2000/XP
 

ariyan321

New Member
سلام مجدد خدمت شما آقای علی سعید و تشکر بابت راهنمایی های قبلیتون.
میخواستم بپرسم که آیا میشه یک فایل dll در ویندوز 98 یا ME نوشت و بعد اون را در ویندوز XP فراخوانی کرد؟
این را برا این میپرسم که دسترسی به دستورات دسترسی مستقیم به پورت در ویندوز 98 و ME راحت می باشد، مثل دستور _outp()، آیا میشه فایل DLL را در 98 نوشت و از این دستورات استفاده کرد و بعد برد تو ویندوز XP که این دستورات را پشتیبانی نمی کنه استفاده کرد؟
اگه نه استفاده از نرم افزارهایی مانند virtual box که میشه در ویندوز xp ویندوز 98 نصب کرد، آیا این ویندوز 98 دستورات دسترسی مستقیم به پورت را در اختیارمون میزاره؟
و سوال دیگه ای که دارم اینکه، وقتی شبیه دستورات فراخوانی dll ای که شما ارایه کردید برای فراخوانی توابع فایل inpout32.dll استفاده میکنم، جواب نمید
 

the_king

مدیرکل انجمن
سلام مجدد خدمت شما آقای علی سعید و تشکر بابت راهنمایی های قبلیتون.
میخواستم بپرسم که آیا میشه یک فایل dll در ویندوز 98 یا ME نوشت و بعد اون را در ویندوز XP فراخوانی کرد؟
این را برا این میپرسم که دسترسی به دستورات دسترسی مستقیم به پورت در ویندوز 98 و ME راحت می باشد، مثل دستور _outp()، آیا میشه فایل DLL را در 98 نوشت و از این دستورات استفاده کرد و بعد برد تو ویندوز XP که این دستورات را پشتیبانی نمی کنه استفاده کرد؟
اگه نه استفاده از نرم افزارهایی مانند virtual box که میشه در ویندوز xp ویندوز 98 نصب کرد، آیا این ویندوز 98 دستورات دسترسی مستقیم به پورت را در اختیارمون میزاره؟
و سوال دیگه ای که دارم اینکه، وقتی شبیه دستورات فراخوانی dll ای که شما ارایه کردید برای فراخوانی توابع فایل inpout32.dll استفاده میکنم، جواب نمید
نه، این کد داخل dll نیست که دسترسی به پورت رو محدود کرده، ویندوز XP ئه که موقع اجرا اینکار رو انجام میده، فرقی نمی کنه که محیط کامپایل اون فایل dll کدوم ویندوز باشه.
ویندوز های 98 و Me آخرین ویندوز هایی بودند که پورت ها رو به حال خودشون رها کرده بودند، ویندوز های جدیدتر مبتنی بر هسته ویندوز NT اند که در مورد امنیت و سطح دسترسی به سخت افزار
محدودیت بیشتری ایجاد می کنند. در ویندوزی مثل XP و Vista و 7 برنامه ای که در حالت User Mode اجرا میشه نمی تونه با پورت ها ارتباط مستقیم برقرار کنه، اینکار
نیازمند Kernel Mode ئه که اصولا با اجرای یک درایور انجام میشه.

در محیط سیستم عامل مجازی می توانید اینکار رو انجام دهید، شخصا برای تنظیم کردن یک نمونه قفل سخت افزاری که با ویندوز های مدرن
سازگار نیست از همین محیط مجازی Oracle VM VirtualBox یا Windows Virtual PC استفاده می کنم.

اینکه جواب نمیده حالت های متفاوتی داره، کد مرحله به مرحله اجرا میشه. باید ببینید در چه مرحله ای به مشکل بر می خورید. ممکنه مشکل مربوط به Load کردن Library باشه،
مربوط به Prototype اشتباهی باشه که برای توابع داخلش بکار می برید، ممکنه مربوط به 32 / 64 بیتی بودن ویندوز تون و ... باشه، در ویندوز های 64 بیتی از Inpoutx64.dll استفاده میشه.
قطعا اون inpout32.dll مثال داره، در www.logix4u.net دنبال مثالش بگردید.
 

ariyan321

New Member
با تشکر مجدد، در استفاده از virtual box دچار مشکل شدم، مشکل هم اینکه به نوع پارتیشن ایراد میگیره، یعنی برا نصب ویندوز me احتیاج به پارتیشن dos داره، اومدم پارتیشن درایو c را fat کردم ولی بازم همون خطا را میده، چیکار باید بکنم؟
در مورد iinpout32.dll هم خدمتتان بگم که ویندوزم 32 بیتی هست و با روشی که خودش فراخونده ارتباط برقرار میشه، اما از روش پیشنهادی جنابعالی استفاده کردم در لود کردن همه فایل های dll مثل kernel.dll و ...ایراد گرفت ولی برنامه اجرا شد اما دیتای درست برنگشت، ضمنا اگه ممکنه طریقه راحت تر و مطمئن تر ارتباط با پورت را توضیح بفرمایید، ممنون میشم.
 

the_king

مدیرکل انجمن
با تشکر مجدد، در استفاده از virtual box دچار مشکل شدم، مشکل هم اینکه به نوع پارتیشن ایراد میگیره، یعنی برا نصب ویندوز me احتیاج به پارتیشن dos داره، اومدم پارتیشن درایو c را fat کردم ولی بازم همون خطا را میده، چیکار باید بکنم؟
در مورد iinpout32.dll هم خدمتتان بگم که ویندوزم 32 بیتی هست و با روشی که خودش فراخونده ارتباط برقرار میشه، اما از روش پیشنهادی جنابعالی استفاده کردم در لود کردن همه فایل های dll مثل kernel.dll و ...ایراد گرفت ولی برنامه اجرا شد اما دیتای درست برنگشت، ضمنا اگه ممکنه طریقه راحت تر و مطمئن تر ارتباط با پورت را توضیح بفرمایید، ممنون میشم.

سوالات مرتبط با ماشین مجازی ربطی به این انجمن برنامه نویسی نداره.
درایو :C ماشین مجازی یا واقعی؟ مگه شما از نو یک ماشین مجازی تعریف نمی کنید؟، اون هارد دیسک اش فعلا پارتیشن بندی نشده می مونه.
برای نصب ویندوز روی یک ماشین مجازی شما CD /DVD قابل بوت ویندوز رو باید بصورت یک درایور CD / DVD حالا مجازی با یک فایل Image یا یک درایو واقعی آماده می کنید، در تنظیمات ماشین مجازی
بخشی برای تنظیم درایو CD / DVD و Image ای که بصورت اختیاری خوانده میشه هست. با اون مشخصات درایو ماشین مجازی رو بوت می کنید.
CD/DVD ویندوز Me که بوت بشه در منوی بوت اش گزینه Command Prompt داره که اونجا امکانات fdisk و format هست.
اول در fdisk یک پارتیشن Primary بسازید، Active partition اش هم کنید تا قابل بوت باشه. احتمالا لازمه که قبل از فرمت سیستم رو Restart کنید.
بعد اون پارتیشن رو فرمت کنید. حالا نصب ویندوز رو آغاز می کنید.

این صفحه نمونه پروژه هست :
Parallel port interfacing in Win32, using C/C++
 

ariyan321

New Member
جناب علی سعید، من اگر بخواهم از همون فایل inpout32.dll به همون روشی که خودش برا ارتباط برقرار کردن استفاده کنم، آیا میتونم تو فایل dll خودم صداش کنم؟
البته خودم اینکار را کردم، در حالت عادی جواب میده، اما موقع فراخوندنش تو فایل dll ای که خودم مینویسم و میخوام تو ی نرم افزار مانیتورینگ فایل خودم را فرابخونم و فایل خودم هم فایل دیگه را فرابخونه به مشکل برخورد میکنه، و به تابع _stdcall() که برای ارتباط با فانکشن های dll ارائه کرده ایراد میگیره و کامپایل نمیکنه، لطفا بنده را راهنمایی نمایید.
ضمنا سوال دیگه هم داشتم که اگر از virtual box استفاده کنم، میتونم برنامه dll را در ویندوز 98 بنویسم و تو وسندوز xp اصلی فراخونیش کنم؟
اینم فکر کنم نشد باشه!!!!!!!!!!!
ممنون از لطف شما.
 

the_king

مدیرکل انجمن
جناب علی سعید، من اگر بخواهم از همون فایل inpout32.dll به همون روشی که خودش برا ارتباط برقرار کردن استفاده کنم، آیا میتونم تو فایل dll خودم صداش کنم؟
البته خودم اینکار را کردم، در حالت عادی جواب میده، اما موقع فراخوندنش تو فایل dll ای که خودم مینویسم و میخوام تو ی نرم افزار مانیتورینگ فایل خودم را فرابخونم و فایل خودم هم فایل دیگه را فرابخونه به مشکل برخورد میکنه، و به تابع _stdcall() که برای ارتباط با فانکشن های dll ارائه کرده ایراد میگیره و کامپایل نمیکنه، لطفا بنده را راهنمایی نمایید.
ضمنا سوال دیگه هم داشتم که اگر از virtual box استفاده کنم، میتونم برنامه dll را در ویندوز 98 بنویسم و تو وسندوز xp اصلی فراخونیش کنم؟
اینم فکر کنم نشد باشه!!!!!!!!!!!
ممنون از لطف شما.

stdcall در کامپایلر های مختلف کلمه کلیدی متفاوتی داره. اگه برای 6.0 ++Visual C می خواهید قبل از stdcall دو تا کاراکتر _ اضافه کنید، یعنی stdcall__ تا مشکل رفع بشه.
اما معمولا برای برنامه نویسی تحت ویندوز بجای stdcall__ از عبارت APIENTRY یا WINAPI استفاده می کنند که نمونه اش در کد ها زیاده، فرقی نمی کنند، ایندو
صرفا یک نام بهتر برای stdcall__ هستند.
 

ariyan321

New Member
با سلام خدمت دوست گرامی آقای علی سعید و تشکر از راهنمایی های خوبتون.
مهندس بنده در یک فایل 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 اصلا اجرا نمیشود.
 

the_king

مدیرکل انجمن
با سلام خدمت دوست گرامی آقای علی سعید و تشکر از راهنمایی های خوبتون.
مهندس بنده در یک فایل 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 اصلا اجرا نمیشود.

متغیر b در جایی تعریف شده باشد.

ابتدا مطمئن شوید که FUNC رو از DLL تون به عنوان خروجی معرفی می کنید. FUNC رو در DLL تان جزو EXPORTS ها درج کرده اید؟ اون فایل def رو در پروژه تان
در گروه Source Files اضافه کرده اید؟
در مرحله دوم کد مربوط به فراخوانی DLL و تابع مورد نظر رو چک کنید. فایل DLL در مسیر مناسب کنار فایل اجرایی برنامه قرار می گیرد؟ typedef ئه تابع FUNC در داخل
برنامه تون هست؟ اسم FUNC دقیقا همانطور نوشته شده؟
 

ariyan321

New Member
بله 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 وجود داره ببینم اون اجرا میشه یا نه؟
ممنون.
 

the_king

مدیرکل انجمن
بله 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 وجود داره ببینم اون اجرا میشه یا نه؟
ممنون.
در مورد if از عبارت حلقه استفاده نکنید، if شرط ئه، بیش از یکبار اجرا نمیشه که حلقه باشه. اگر کدی دیگری می نویسید اجرا میشه پس قطعا if هم اجرا میشه.
بستگی داره که b کجا تعریف شده باشه و چطور استفاده بشه.

متغیر های static که بحث شون جداست اما در مورد متغیر های معمولی، آنها را یا داخل تابع تعریف می کنید (محلی)، یا خارج از بدنه تابع (سراسری)
متغیر محلی که تکلیف اش معلومه، هر بار که اجرا میشه بوجود میاد و موقع خاتمه از بین میره. چه در DLL و چه در غیر DLL
پس مقدارش برای دفعات بعدی اجرای تابع حفظ نمیشه. می مونه متغیر های سراسری، توجه داشته باشید که متغیر های سراسری تا زمانی که
اون DLL فراخوانی شده و بهش دسترسی دارید و در حال استفاده است وجود داره،
پس در DLL مقادیر متغیر های سراسری صرفا بین LoadLibrary و FreeLibrary وجود دارند، بعد از هر FreeLibrary حافظه مقادیر آزاد می شود.
اگر چند بار پی در پی LoadLibrary و FreeLibrary اجرا بشه، مقادیر بین شون مشترک نخواهد بود.
 

ariyan321

New Member
با سلام مجدد و تشکر از جناب آقای علی سعید
مهندس آیا امکان برگرداندن دو مقدار و یا بیشتر در یک فایل dll وجود دارد؟
چگونه و به چه ترتیب متغیرها باز میگردن؟
ضمنا یک سوال دیگه داشتم و اینکه ی فایل dll که حدود 120 ورودی میتواند دریافت نوشتم و از یک نرم افزار مونیتورینگ صنعتی فرا خوندمش، با نوشتن یک عدد ثابت dll به خوبی کار میکنه، اون عدد ثابت شماره کانال یک A/D صنعتی هست، اما وقتی
بیشتر از یک عدد به عنوان انتخاب کانال ورودی میفرستم یک عدم هماهنگی بین dll و نرم افزار مونیتورینگ به وجود میاد و فقط یکی از مقادیر خروجی و اونم اولین مقدار در تمام متغییرها قرار میگره، حال آنکه با انتخاب کانال می بایست مقدار دیجیتال مربوط
به هر کانال در متغییر مربوطه قرار بگیره، نرم افزار مونیتورینگ کدهای مخصوص خودش را داره و اسم زبانش cicode می باشد، به انعطاف پذیری زبان نرم افزار مطمین نیستم و از طرفی به سنکرون بودن و یا عدم سرعت پاسخگویی کافی dll هم شک دارم
از لحاظ برنامه نویسی c++ چه کاری میتوان برا سنکرون سازی انجام داد؟
با تشکر از جنابعالی.
 

جدیدترین ارسال ها

بالا