ورود

View Full Version : سوال: مشکل در کار با منابع در win32



ashkan_203
پنج شنبه 15 مرداد 1388, 09:49 صبح
من مدتیه که ازسر اجبار دارم برنامه نویسی win32 با ++C رو با استفاده از کمپایلر visual studio 6 یاد می گیرم البته این کار خیلی برام لذت بخشه ولی مدتیه که به یه مشکل در کار با منابع برخوردم که احساس می کنم بهتر بود از ویژوال بیسیک به سی پلاس پلاس تغییر زبان نمی دادم. مشکلم هم خیلی بچه گانه است ولی هر کاری می کنم نمیشه درستش کرد .
من خیلی وقته که با منابع کار می کنم و برای استفاده از منابعی مثل ایکن و کرزر و صدا و ... از فراخوانی با ارجاعهای نمادی استفاده می کنم.
اولین سوالم اینه که چرا وقتی منابع رو مثل رشته در هنگام تعیین کلاس ویندوز فراخوانی می کنم به جز آیکن هیچ کدوم عمل نمی کنه (مثل کرزر) تازه آیکن هم نصفه نیمه عمل می کنه و فقط برنامه exe آیکن رو داره و اصلا آیکنی در پنجره نیست

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

unexpected end of file found

Nima_NF
پنج شنبه 15 مرداد 1388, 13:35 عصر
متاسفانه سوال اول را اصلا متوجه نشدم... مفهوم نبود

سوال دوم هم بدون دیدن کد، قابل حل نیست، دلایل مختلفی دارد:
- ممکن هست یک پرانتز را فراموش کرده باشید که باز کنید با ببندید.
- ممکن هست <stdafx.h> را در ابتدای کد قرار نداده باشید.
- خلاصه هر موردی که جا افتاده باشد و کامپایلر نتواند تشخیص دهد.

ashkan_203
پنج شنبه 15 مرداد 1388, 15:58 عصر
متاسفانه سوال اول را اصلا متوجه نشدم... مفهوم نبود
ببخشید که بد نوشتم .
منظورم اینه که دیگه فایل هدر برای منابع تعریف نکنم و به جای مثلا

LoadIcon(hinstance,MAKEINTRESOURCE(IDI_ash))
بنویسم

LoadIcon(hinstance,"IDI_ash")



سوال دوم هم بدون دیدن کد، قابل حل نیست، دلایل مختلفی دارد:
- ممکن هست یک پرانتز را فراموش کرده باشید که باز کنید با ببندید.
- ممکن هست <stdafx.h> را در ابتدای کد قرار نداده باشید.
- خلاصه هر موردی که جا افتاده باشد و کامپایلر نتواند تشخیص دهد.
کد پایین رو توی یکی از پروژه ها نوشتم اجرا میشه . اما وقتی همین کد رو در پروژه ی دیگر می نویسم یا حتی کپی می کنم اون اخطار رو میده. خودمم دارم دیوونه میشم اینقدر کارکتر به کارکتر کد ها بررسی می کنم :عصبانی++:

#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <math.h>

#include "res.h"


LRESULT CALLBACK windowproc(HWND hwnd,UINT msg,
WPARAM wparam,LPARAM lparam)
{
PAINTSTRUCT ps;
HDC hdc;

switch(msg)
{
case WM_CREATE:
{
return(0);
} break;
case WM_PAINT:
{
hdc=BeginPaint(hwnd,&ps);
EndPaint(hwnd,&ps);
return(0);
} break;
case WM_DESTROY:
{
PostQuitMessage(0);
return(0);
} break;

default : return(DefWindowProc(hwnd,msg,wparam,lparam));
}

return(0);
}

int WINAPI WinMain(HINSTANCE hinstance,
HINSTANCE hprevinstance,
LPSTR lpCmdLine,
int nShowCmd)
{

WNDCLASSEX winclass;

winclass.cbSize=sizeof(WNDCLASSEX);
winclass.style=CS_CLASSDC;
winclass.lpfnWndProc=windowproc;
winclass.cbClsExtra=0;
winclass.cbWndExtra=0;
winclass.hInstance=hinstance;
winclass.hCursor=LoadCursor(hinstance,MAKEINTRESOU RCE(IDC_ash)) ;
winclass.hIcon=LoadIcon(hinstance,MAKEINTRESOURCE( IDI_ash));
winclass.hIconSm=NULL;
winclass.hbrBackground=(HBRUSH)GetStockObject(BLAC K_BRUSH);
winclass.lpszClassName="WIN1";
winclass.lpszMenuName=NULL;


if (!RegisterClassEx(&winclass))
return(0);

HWND hwnd;
if (! (hwnd=CreateWindow("WIN1","My Window",WS_OVERLAPPEDWINDOW | WS_VISIBLE,
320,240,320,240,NULL,NULL,hinstance,NULL)))
return FALSE;


MSG msg;
while(TRUE)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if(msg.message==WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
UnregisterClass("WIN1",hinstance);
return(0);
}

Nima_NF
پنج شنبه 15 مرداد 1388, 16:37 عصر
برای مورد اول، همانطور که می دانید شما باید یک نام در قسمت properties به جای ID تعریف کنید. یعنی نام مورد نظر حتما داخل " " در فیلد نوشته شود، در غیر این صورت ID ذخیره می شود نه رشته نام. که احتمالا اشکال کار شما همینجاست.

به این شکل مشکلی نیست و مستقیم به همان روش دوم که نوشتید می توانید برای سایر موارد عمل کنید، همیشه در MSDN چک کنید، در آنجا ذکر شده است که رشته مورد قبول هست یا نه. تقریبا برای همه منابع رشته مورد قبول هست.

توصیه می کنم بیشتر از ID ها استفاده کنید، منابع اصلی مانند منو و آیکن اصلی به شماره ID تعریف شده نگاه می کنند و کم ترین پیش فرض پنجره می شود.


برای مورد دوم، مشکلی در تابع وجود ندارد، احتمالا در پروژه ای که کپی می کنید ترتیب تعریف هدر فایل ها را رعایت نمی کنید، یا define های اضافی تعریف می کنید. دقت کنید که به windowsx هم نیاز ندارید، مگر اینکه دارید از قابلیت های فوق قدیمی 16 بیت استفاده می کنید.

ضمنا define خط اول را حذف کنید، و "stdafx.h" در صورت وجود فراموش نشود.

ashkan_203
پنج شنبه 15 مرداد 1388, 18:48 عصر
دستتون درد نکنه توی روش اول مشکلم حل شد .توی فیلد اونهارو به صورت رشته ننوشته بودم :خجالت:
برای روش دوم هم مثل دفعات قبل وقتی کمپایل می کنم ارور نمی ده ولی برای بیلد کردن خطای قبلی رو میده . فکر نکنم مال stdafx باشه چون همون سورسی رو که براتون گذاشتم داره کار می کنه . مطمئنم که define اضافی ندارم . اگه میشه مراحل ترتیب تعریف هدر فایل رو برام بگویید چون از روی جزوه ای که یه بار از روش درست جواب گرفتم دویست بار دیگه امتحان کردم همون ارور رو میده . البته باید ببخشید من توی ++C تازه کارم.
البته من نمی خوام کامل برنامه نویسی ویندوز رو یاد بگیرم و فقط به یه پیش نیاز برای شروع کار با DirectX احتیاج دارم
در مورد اون define اولی هم می خوام تمام سربارهای mfc از برنامه حذف بشه تا هنگام اجرای بازی سرعت اون بالا بره (البته من اینطور فهمیدم)
در مورد اون windowex هم من با یه سری مقالات پیش می روم (البته چند کتاب انگلیسی هم به طور متناوب می خونم) و فکر می کنم در ادامه مقالات به کارم بیاد .

DLL_DLL
پنج شنبه 15 مرداد 1388, 21:48 عصر
فکر نکنم با Vc6 هدر stdafx را لازم داشته باشه!

Nima_NF
جمعه 16 مرداد 1388, 01:06 صبح
این تاپیک را مطالعه کنید (کلیک کنید) (http://barnamenevis.org/forum/showthread.php?p=596104) و سپس طبق آن پروژه خود را که می گویید این خطا دریافت می شود zip کرده و اینجا قرار دهید تا بررسی کنم.