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

behnamm73

New Member
با سلام خدمت دوستان عزیز

من در حال نوشتن یک فایل dll به زبان ویژوال سی پلاس پلاس هستم و لی متاسفانه هنوز آشنایی کامل به این زبان ندارم و نیاز به کدی برای خواندن تایتل برنامه و نشان دادن جزئیات آن را دارم . اگر یکی از دوستان محبت کنند و این چند خط کد را برای من بنویسند ممنون میشم.

با تشکر
 

the_king

مدیرکل انجمن
با سلام خدمت دوستان عزیز

من در حال نوشتن یک فایل dll به زبان ویژوال سی پلاس پلاس هستم و لی متاسفانه هنوز آشنایی کامل به این زبان ندارم و نیاز به کدی برای خواندن تایتل برنامه و نشان دادن جزئیات آن را دارم . اگر یکی از دوستان محبت کنند و این چند خط کد را برای من بنویسند ممنون میشم.

با تشکر

عموما شما توی فایل های DLL صرفا یکسری توابع قرار خواهید داد، پنجره ای ندارید که Title اش رو بخونید،
منظورتون کدوم Title و جزئیاته؟

تاپیک منتقل گردید.
 

behnamm73

New Member
عموما شما توی فایل های DLL صرفا یکسری توابع قرار خواهید داد، پنجره ای ندارید که Title اش رو بخونید،
منظورتون کدوم Title و جزئیاته؟

تاپیک منتقل گردید.

با سلام خدمت شما

این فایل DLL را برای استفاده در برنامه ای است که به زبان MQL نوشتم و در برنامه Metatrader استفاده میشه .
dll باید تایتل Metatrader را بخونه و چک کنه که آیا عددی که در تایتل هست با عدد 434246 برابر هست یا نه.
 

the_king

مدیرکل انجمن
با سلام خدمت شما

این فایل DLL را برای استفاده در برنامه ای است که به زبان MQL نوشتم و در برنامه Metatrader استفاده میشه .
dll باید تایتل Metatrader را بخونه و چک کنه که آیا عددی که در تایتل هست با عدد 434246 برابر هست یا نه.

اگه شما شماره Handle پنجره رو دریافت کنید، می توانید با استفاده از دستور GetWindowText عنوان پنجره (Title)
را دریافت کنید. طول رشته این عنوان (برحسب کاراکتر) هم توسط تابع GetWindowTextLength قابل دریافت کردنه.
در ادامه می توانید متن داخل این عنوان را به یک عدد تبدیل کنید (کاراکتر های غیر عددی داخل عنوان را نادیده بگیرید)،
و سپس با مقداری مثل 434246 مقایسه کنید.

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

در مثال زیر تابع MyFunction می تواند از داخل یک فایل DLL برای استفاده سایر برنامه ها Export شود.
این تابع پارامتر hWnd را که شماره Handle یک پنجره است دریافت می کند و اگر در عنوان آن پنجره عدد 434246
وجود داشت عدد 1 و در غیر اینصورت عدد 0 را به عنوان مقدار بازگشتی بر می گرداند :
کد:
int APIENTRY MyFunction(int hWnd)
{
	int n = GetWindowTextLength((HWND)hWnd) + 1;
	char* title = new char[n];
	GetWindowText((HWND)hWnd, title, n);
	int x = 434246, y = 0;
	for (int i = 0; title[i]; i++)
	{
		if ((title[i] >= '0') && (title[i] <= '9'))
			y = y * 10 + title[i] - '0';
		else
		{
			if (y != 0)
				break;
		}
	}
	delete[] title;
	return (x == y) ? 1 : 0;
}

در زبان ++Visual C عموما برای Export کردن توابع از داخل یک فایل DLL فایلی با پسوند def مثل export.def
به پروژه اضافه می کنند که یک فایل متنی است و متنی مشابه متن زیر در آن قرار دارد :
کد:
LIBRARY   [B][COLOR="Blue"]DLLTitle[/COLOR][/B]
EXPORTS
	[B][COLOR="Blue"]MyFunction[/COLOR][/B]
DLLTitle عنوان فایل DLL است که می تواند هر متن دلخواهی باشد.
MyFunction نام تابع یا متغیری است که باید Export شود و برای Export کردن چند تابع یا متغیر می تواند بجای
یک سطر چند سطر متوالی باشد.
موقع کامپایل کردن پروژه این فایل def بررسی شده و توابعی که اسم شان در آن وجود دارد در فایل DLL
Export خواهد شد.
 

behnamm73

New Member
با سلام

ضمن تشکر بابت پاسخگویی و راهنماییتان . بر اساس کدی که شما محبت کردید و نوشتید فایل دی ال ال را به این صورت نوشتم :

PHP:
CTitleApp theApp;
int APIENTRY MyFunction(int hWnd)
{
 int n = GetWindowTextLength((HWND)hWnd) + 1;
 char* title = new char[n];
 GetWindowText((HWND)hWnd, title, n);
 int x = 116634, y = 0;
 for (int i = 0; title[i]; i++)
 {
  if ((title[i] >= '0') && (title[i] <= '9'))
   y = y * 10 + title[i] - '0';
  else
  {
   if (y != 0)
    break;
  }
 }
 delete[] title;
 return (x == y) ? 1 : 0;
}

و برنامه ای که قرار است شماره پنجره را به DLL بدهد و عدد برگشتی را از آن فراخوانی کند اینطور نوشتم : ( برنامه به زبان MQL است . جهت اطلاع زبان MQL دقیقا سینتکس سی است. و comment در این زبان نوعی پرینت است )

PHP:
int start()
  {
  int hWnd ;
 
   hWnd = (WindowHandle(Symbol(),0));
 
   if (MyFunction(hWnd)== 1)
 
   Comment ("Account Number is OK") ;
 
   if (MyFunction(hWnd)== 0)
 
   Comment ("Account Number is Forbidden") ;
 
   return(0);
  }

ولی هنگام اجرای برنامه با وجود درست بودن شماره اکانت (116634) باز عدد صفر را برمیگرداند !
ممنون میشم نظرتان را بفرمائید که ایراد کار از کجا میتواند باشد ؟

با تشکر
 

the_king

مدیرکل انجمن
ولی هنگام اجرای برنامه با وجود درست بودن شماره اکانت (116634) باز عدد صفر را برمیگرداند !
ممنون میشم نظرتان را بفرمائید که ایراد کار از کجا میتواند باشد ؟

با تشکر

در داخل تابع MyFunction بعد از کد GetWindowText یک کد MessageBox اضافه کنید تا متن Title را نشان دهد :
کد:
	int n = GetWindowTextLength((HWND)hWnd) + 1;
	char* title = new char[n];
	GetWindowText((HWND)hWnd, title, n);
[B][COLOR="Blue"]	MessageBox(0, title, 0, 0);[/COLOR][/B]
	int x = 1234, y = 0;
	for (int i = 0; title[i]; i++)
	{

مجددا فایل DLL را کامپایل کنید و برنامه را اجرا نمایید. الان اگه واقعا تابع MyFunction فراخوانی شده باشد،
دو بار متن Title را در یک پنجره که دکمه OK دارد مشاهده خواهید کرد (چون دوبار MyFunction را در برنامه تان
فراخوانی کرده اید) و معلوم می شود که ایراد از چیست، احتمالا متن Title آن چیزی نیست که انتظارش را داریم.
 

behnamm73

New Member
در داخل تابع MyFunction بعد از کد GetWindowText یک کد MessageBox اضافه کنید تا متن Title را نشان دهد :
کد:
    int n = GetWindowTextLength((HWND)hWnd) + 1;
    char* title = new char[n];
    GetWindowText((HWND)hWnd, title, n);
[B][COLOR=blue]  MessageBox(0, title, 0, 0);[/COLOR][/B]
    int x = 1234, y = 0;
    for (int i = 0; title[i]; i++)
    {

مجددا فایل DLL را کامپایل کنید و برنامه را اجرا نمایید. الان اگه واقعا تابع MyFunction فراخوانی شده باشد،
دو بار متن Title را در یک پنجره که دکمه OK دارد مشاهده خواهید کرد (چون دوبار MyFunction را در برنامه تان
فراخوانی کرده اید) و معلوم می شود که ایراد از چیست، احتمالا متن Title آن چیزی نیست که انتظارش را داریم.

کد را اضافه کردم و مجددا فایل DLL را کامپایل و برنامه را اجرا کردم . پنجره ای خالی با عنوان ارور باز میشود و هیچ متنی در آن نیست .

جهت اطلاع متن TItle باید به اینگونه باشد :
PHP:
116634:Intel FX Mtatader 4-[EURUSD,M30]
که عدد شش رقمی اول همان شماره اکانت مورد نظر است .
 

the_king

مدیرکل انجمن
کد را اضافه کردم و مجددا فایل DLL را کامپایل و برنامه را اجرا کردم . پنجره ای خالی با عنوان ارور باز میشود و هیچ متنی در آن نیست .

جهت اطلاع متن TItle باید به اینگونه باشد :
PHP:
116634:Intel FX Mtatader 4-[EURUSD,M30]
که عدد شش رقمی اول همان شماره اکانت مورد نظر است .

اگه در پنجره متن عنوان نمایش داده نمی شود پس شماره Handle پنجره ای که به تابع ارسال کرده اید شماره پنجره ای
نیست که مورد نظر ما است. الان تابع فقط یک عنوان خالی دریافت می کند که فقط عدد 0 از آن استخراج می گردد.
 

behnamm73

New Member
اگه در پنجره متن عنوان نمایش داده نمی شود پس شماره Handle پنجره ای که به تابع ارسال کرده اید شماره پنجره ای
نیست که مورد نظر ما است. الان تابع فقط یک عنوان خالی دریافت می کند که فقط عدد 0 از آن استخراج می گردد.

برای مشخص شدن درست بودن شماره Handle پنجره ای که به تابع ارسال میشود این کد را در برنامه ای نوشتم که شماره Handle پنجره را روی صفحه برنامه (Metatrader ) نشان دهد :

PHP:
{
int hWnd ;
 
   hWnd = (WindowHandle(Symbol(),0));
   Comment (hWnd);
   return(0);
  }

حال با وارد کردن شماره نشان داده شده به یک برنامه exe که یکی از دوستان به همین منظور نوشته اند مشخصات Title به صورت تفکیک شده در یک پنجره نشان داده میشود (طبق تصویر ) و این نشانگر این است که شماره Handle پنجره ای که به تابع ارسال میگردد همان شماره پنجره مورد نظر ما است . درواقع این برنامه exe همان کاری را انجان میدهد که در فایل DLL باید انجام شود :

picture.php
 

the_king

مدیرکل انجمن
حال با وارد کردن شماره نشان داده شده به یک برنامه exe که یکی از دوستان به همین منظور نوشته اند مشخصات Title به صورت تفکیک شده در یک پنجره نشان داده میشود
از همان دوست تان بپرسید که برای خواندن عنوان مستقیما از یک GetWindowText استفاده کرده اند و یا
قبلا از آن مراحل دیگری هم نیاز هست، شاید هم از تابع دیگری استفاده شده.
 

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

بالا