PDA

View Full Version : سوال: آرگومان رشته ای



amirbn1
جمعه 21 تیر 1387, 16:06 عصر
سلام.من دفعه پیش یک تاپیک با موضوع سوال ایجاد کردم ولی چند ساعت بعد آمدم که ببینم جواب آمده یا نه ،دیدم تاپیک حذف شده است.شاید موضوعم خیلی پیش پا افتاده بود.

اما حال یک سوال حرفه ای از اساتید دارم که چند روزی است سرم را درد آورده است.

مشکل اینه که من میخوام یک تابع(LoadKeyboardLayout) از user32.dll را فراخوانی کنم.کد را هم اینطور نوشتم:

HINSTANCE HI;
HI = AfxLoadLibrary("user32");
if (HI == NULL)
AfxMessageBox("Error!");
typedef int (__stdcall *GPA)(CString A1,int A2);
GPA GPAF;
GPAF = (GPA) GetProcAddress(HI,"LoadKeyboardLayout");
GPAF("00000429",1

بعد برنامه را اجرا کردم بودن هیچ خطایی.ولی بعد از اینکه روی دکمه کلیک کردم با پیغام خطای خود ویندوز مواجه شدم.من که موندم چی کار کنم.

البته خودم فکر میکنم که مشکل از خط 5 آنجایی که نوشتم CString .چراکه وقتی توابعی را که رشته همانند این نمیخواهند اجرا میکنم هیچ مشکلی پیش نمیآید و برنامه اجرا میشود.حال تمنا دارم که شما یک کمکی کنید.

Nima_NF
جمعه 21 تیر 1387, 23:28 عصر
سوال قبلی شما به خاطر عنوان نامناسب توسط مدیران ارشد پاک شد.

اما در مورد سوال شما، چرا شما به این صورت تابع LoadKeyboardLayout را فراخوانی کردید؟
چون از آنجایی که معلوم است از MFC استفاده می کنید و اصلا نیاز به فراخوانی این dll اصلی ویندوز به صورت run-time نیست و فقط کافیست User32.lib را به برنامه لینک کنید و مستقیم از توابع آن استفاده کنید.

حتما پیام خطا و نسخه کامپایلر شما را هم ذکر کنید تا بتوانیم بهتر کمک کنیم.
ضمنا برای خوانایی بیشتر از تگ code استفاده کنید.

amirbn1
شنبه 22 تیر 1387, 08:31 صبح
سلام.
من از این تابع برای فعال کردن زبان فارسی استفاده میکنم و آنرا قبلاً در ویژال بیسیک اجرا کرده ام بدون هیچ مشکلی.
اگر میشود بگویید که چطور User32.lib را به برنامه لینک کنم و از توابع آن استفاده کنم.در ضمن من گفتم که آنها بدون هیچ خطایی در کامپایلر اجرا میشوند اما هنگامی که برنامه اجرا میشود و روی دکمه کلیک میشود ویندوز خودش ارور میدهد.ارورش هم همه با آن آشنا هستید ،3دکمه به نامهای Don;t send , Send this problemودیباگ.
کامپایلر:VC++ 6
البته فکر کنم که منظورتان این خط کد باشد:


#pragma comment(lib,"user32.lib")

Nima_NF
شنبه 22 تیر 1387, 14:46 عصر
بله یک راه همان خط کد هست:



#pragma comment(lib,"user32.lib")

نکته: استفاده از تگ کد فراموش نشود.

راه دیگر به این شکل:
در VC++6 به منوی Project -> Settings بروید و سپس در پنجره link و در قسمت Object/library modules آن را اضافه کنید. (step 7 در این مقاله (http://www.codeproject.com/KB/DLL/XDllPt1.aspx))

بعد فقط مستقیم از تابع LoadKeyboardLayout بدون کدهای دیگری که نوشتید استفاده کنید. در ++C شما دسترسی مستقیم به API ها دارید و نیاز نیست مانند VB عمل کنید.

ضمنا مطالعه این مطلب نیز شاید برایتان مفید باشید:
تفکرات اشتباه در مورد VC++6 (http://barnamenevis.org/forum/showthread.php?t=111283)

mehdi.mousavi
شنبه 22 تیر 1387, 17:17 عصر
سلام.
من از این تابع برای فعال کردن زبان فارسی استفاده میکنم و آنرا قبلاً در ویژال بیسیک اجرا کرده ام بدون هیچ مشکلی.
اگر میشود بگویید که چطور User32.lib را به برنامه لینک کنم و از توابع آن استفاده کنم.در ضمن من گفتم که آنها بدون هیچ خطایی در کامپایلر اجرا میشوند اما هنگامی که برنامه اجرا میشود و روی دکمه کلیک میشود ویندوز خودش ارور میدهد.ارورش هم همه با آن آشنا هستید ،3دکمه به نامهای Don;t send , Send this problemودیباگ.
کامپایلر:VC++ 6
البته فکر کنم که منظورتان این خط کد باشد:
#pragma comment(lib,"user32.lib")



سلام.
تو نرم افزارهای MFC نیازی به Load کردن user32.dll بصورت early/late binding ندارین، چون خود کامپایلر قبلا اینکار رو براتون انجام داده. شما کافی هستش تا بصورت زیر تابع مورد نظر رو فراخوانی کنید:



HKL handle = LoadKeyboardLayout(_T("00000409"), KLF_ACTIVATE);
if(handle != NULL)
{
//Do whatever
UnloadKeyboardLayout(handle);
}
لطفا دقت کنید که بعد از اینکه کارتون با handle تموم شد، باید اونو به تابع UnloadKeyboardLayout بدین تا handle گرفته شده به سیستم برگرده. در مورد Pointer به function ای هم که تعریف کردین، حق با شماست. شما باید پارامتر اول رو به LPCTSTR و پارامتر دوم رو به UINT تغییر بدین. اما در کل، مطلقا نیازی به late binding و استفاده از روشی که ذکر کردین، نیست.

Nima_NF
شنبه 22 تیر 1387, 18:23 عصر
تو نرم افزارهای MFC نیازی به Load کردن user32.dll بصورت early/late binding ندارین، چون خود کامپایلر قبلا اینکار رو براتون انجام داده. کاملا درست هست، موقع پاسخ اصلا دقت نکردم.
در VC (برای MFC و win32) آن سری از کتابخانه های اصلی که در هدر windows.h و مشتقاتش تعریف شده اند قبل به لینکر اضافه شده اند و نیازی به لینک نیست.

فقط دقت کنید که اگر می خواهید از یک رشته CString استفاده کنید از متد GetBuffer استفاده کنید تا رشته را به صورت *TCHAR به پارامتر اول API که از همان نوع یعنی LPCTSTR است، ارسال کنید، نه خود رشته CString را :



CString string( _T("00000409"));

LoadKeyboardLayout(string.GetBuffer ( 30 ), KLF_ACTIVATE);