PDA

View Full Version : سوال: مشکل در اجرای یه برنامه dll از کتاب برنامه نویسی ویندوز(win32 )



feri88
چهارشنبه 26 فروردین 1388, 12:02 عصر
سلام
من یه مثال dll از روی کتاب برنامه نویسی win32 رو اجرا کردم ولی دو تا ارور لینک میده که هر کاریش می کنم رفع نمی شه.
عین دستورالعمل کتاب انجام دادم ولی این ارورها رو میده:

------ Build started: Project: EDRTEST, Configuration: Debug Win32 ------
Linking...
MSVCRTD.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
D:\EDRTEST\Debug\EDRTEST.exe : fatal error LNK1120: 1 unresolved externals

EDRTEST - 2 error(s), 0 warning(s)

میشه بگین چه جوری این ارورها رو رفع کنم؟

در ضمن اینم کدهای موجود در کتاب:
اینا کدهای هدر و سورس dll :

/*----------------------
EDRLIB.H header file
----------------------*/
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif
EXPORT BOOL CALLBACK EdrCenterTextA (HDC, PRECT, PCSTR) ;
EXPORT BOOL CALLBACK EdrCenterTextW (HDC, PRECT, PCWSTR) ;
#ifdef UNICODE
#define EdrCenterText EdrCenterTextW
#else
#define EdrCenterText EdrCenterTextA
#endif



/*-------------------------------------------------
EDRLIB.C -- Easy Drawing Routine Library module
(c) Charles Petzold, 1998
-------------------------------------------------*/
#include <windows.h>
#include "edrlib.h"
int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
{
return TRUE ;
}
EXPORT BOOL CALLBACK EdrCenterTextA (HDC hdc, PRECT prc, PCSTR pString)
{
int iLength ;
SIZE size ;
iLength = lstrlenA (pString) ;
GetTextExtentPoint32A (hdc, pString, iLength, &size) ;
return TextOutA (hdc, (prc->right - prc->left - size.cx) / 2,
(prc->bottom - prc->top - size.cy) / 2,
pString, iLength) ;
}
EXPORT BOOL CALLBACK EdrCenterTextW (HDC hdc, PRECT prc, PCWSTR pString)
{
int iLength ;
SIZE size ;
iLength = lstrlenW (pString) ;
GetTextExtentPoint32W (hdc, pString, iLength, &size) ;
return TextOutW (hdc, (prc->right - prc->left - size.cx) / 2,
(prc->bottom - prc->top - size.cy) / 2,
pString, iLength) ;
}

اینم کد یه برنامه ی win32 console application که از یه تابع موجود در dll استفاده می کنه(همون تستر dll هستش!)


/*--------------------------------------------------------
EDRTEST.C -- Program using EDRLIB dynamic-link library
(c) Charles Petzold, 1998
--------------------------------------------------------*/
#include <windows.h>
#include "edrlib.h"
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("StrProg") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, TEXT ("DLL Demonstration Program"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rect) ;
EdrCenterText (hdc, &rect,
TEXT ("This string was displayed by a DLL")) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

توی ویژوال 2008 ورک اسپیس ایجاد کردم که توی اون 2 تا پروژه یکی واسه dll و یکی واسه همون برنامه فراخوانه، ایجاد کردم.
برنامه dll (یا همون EDRLIB ) درست اجرا شد و فایلهای dll و lib هم درست تولید شد، ولی وقتی می خوام EDRTEST رو اجرا کنم اون 2 تا ارور رو میده.
(در ضمن دستورهای کتابم مو به مو اجرا کردم)
اگه اطلاعات دیگه ای در موردش نیاز بود، بگین بذارم. سعی کردم کامل توضیح بدم.
مرسی

Nima_NF
چهارشنبه 26 فروردین 1388, 14:41 عصر
1- اگر پروژه در همان solution پروژه فایل exe شما نیست یا اینکه dll در فولدر فایل اجرایی نیست،ابتدا قبل از کامپایل آن را در فولدر فایل اجرایی کپی کنید یا در فولدر system32 ویندوز.

سپس در پروژه exe شما، از منوی project و گزینه properties به قسمت linker بروید و در زیر شاخه input در additional dependenciesنام فایل lib وارد کنید، مثلا mytest.lib


2- شما اشتباها win32 console application را ساخته اید (برای exe)، در حالی که باید win32 project را انتخاب کنید (در wizard حتما باید win32 application انتخاب شود نه console)

feri88
پنج شنبه 27 فروردین 1388, 14:41 عصر
سلام
خیلی ممنون،مشکلم حل شد
مشکلش این بود که به جای windows application ، نوع Console application رو انتخاب کرده بودم!

حالا یه سوال دیگه دارم؟
من که فایل dll و lib و .h رو توی فولدر exe کپی کرده بودم، پس چرا دوباره باید اونو تو additional dependency هم تعریف کرد؟
چرا همین جوری اوتومات (مثل هدر) به libکه تو فولدرش هست لینک نمی کنه؟

از طرفی فرق additional dependency که توی input لینکر هست با additional library که توی General لینکر است، چیه؟

باز هم مرسی که کمک کردین

Nima_NF
جمعه 28 فروردین 1388, 02:53 صبح
وقتی یک فایل .h را در جایی از کدهای خود include می کنید مثل این است که محتویات تمامی آن فایل ذر آن قسمت از فایل cpp شما کپی می شود، به همین خاطر هست که ترتیب تعریف آن ها نیز در بسیاری از موارد مهم هست.

اما فایل های .lib فایل های کد معمولی نیستند، بلکه شامل آدرس های توابع موجود در dll ها هستند، پس کامپایلر در هنگام کامپایل برنامه، برای اینکه بفهمد از کجای dll باید تابع را بخواند ابتدا به linker مراجعه می کند و از آن چنین اطلاعاتی را بدست می آورد.

در بخش general شما مسیر فولدی که lib در آن هست را مشخص می کنید (در صورتی که فایل lib را در فولدر های مشخص شده قبلی که در option VC تعریف شده است نریزید، در قسمت Linker باید کل مسیر و فولدر را علاوه بر نام فایل lib بنویسید)