/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Fejl på den ene oversætter men ikke den an~
Fra : Jacob Jensen


Dato : 22-01-05 19:18

Nu har jeg forsøgt at lege en lille smule med et simpelt windowsprogram. Et
sted har jeg linjen:

WindowClass.hbrBackground = static_cast<HBRUSH>(GetStockObject(GRAY_BRUSH));

Når jeg oversætter programmet med minGW-oversætteren (http://www.mingw.org/)
sker følgende:

>g++ test.cpp -o test
C:\DOCUME~1\Jacob\LOCALS~1\Temp/ccyiaaaa.o(.text+0x74):test.cpp: undefined
reference to `GetStockObject@4'
C:\DOCUME~1\Jacob\LOCALS~1\Temp/ccyiaaaa.o(.text+0x1c1):test.cpp: undefined
reference to `SetBkMode@8'

Hvis jeg oversætter programmet med MS Visual C++ 6 virker det fint nok.



Kildekode:

#include <windows.h>

long WINAPI WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM
lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASS WindowClass; // Structure to hold our window's
attributes

static char szAppName[] = "OFWin"; // Define window class name
HWND hWnd; // Window handle
MSG msg; // Windows message structure

// Redraw the window if the size changes
WindowClass.style = CS_HREDRAW | CS_VREDRAW;

// Define our procedure for message handling
WindowClass.lpfnWndProc = WindowProc;

WindowClass.cbClsExtra = 0; // No extra bytes after the window
class
WindowClass.cbWndExtra = 0; // structure or the window instance

WindowClass.hInstance = hInstance; // Application instance handle

// Set default application icon
WindowClass.hIcon = LoadIcon(0, IDI_APPLICATION);

// Set window cursor to be the standard arrow
WindowClass.hCursor = LoadCursor(0, IDC_ARROW);

// Set gray brush for background color
WindowClass.hbrBackground =
static_cast<HBRUSH>(GetStockObject(GRAY_BRUSH));

WindowClass.lpszMenuName = 0; // No menu, so no menu resource
name

WindowClass.lpszClassName = szAppName; // Set class name

// Now register our window class
RegisterClass(&WindowClass);

// Now we can create the window
hWnd = CreateWindow(
szAppName, // the window class name
"A Basic Window the Hard Way", // The window title
WS_OVERLAPPEDWINDOW, // Window style as overlapped
CW_USEDEFAULT, // Default screen position of upper left
CW_USEDEFAULT, // corner of our window as x,y...
CW_USEDEFAULT, // Default window size
CW_USEDEFAULT, // ....
0, // No parent window
0, // No menu
hInstance, // Program Instance handle
0 // No window creation data
);

ShowWindow(hWnd, nCmdShow); // Display the window
UpdateWindow(hWnd); // Cause window client area to be drawn

// The message loop
while(GetMessage(&msg, 0, 0, 0) == TRUE) // Get any messages
{
TranslateMessage(&msg); // Translate the message
DispatchMessage(&msg); // Dispatch the message
}

return msg.wParam; // End so return to Windows
}

long WINAPI WindowProc(HWND hWnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
HDC hDC; // Display context handle
PAINTSTRUCT PaintSt; // Structure defining area to be drawn
RECT aRect; // A working rectangle

switch(message) // Process selected messages
{
case WM_PAINT: // Message is to redraw the
window
hDC = BeginPaint(hWnd, &PaintSt); // Prepare to draw the window

// Get upper left and lower right of client area
GetClientRect(hWnd, &aRect);

SetBkMode(hDC, TRANSPARENT); // Set text background mode

// Now draw the text in the window client area
DrawText(
hDC, // Device context handle
"But, soft! What light through yonder window breaks?",
-1, // Indicate null terminated string
&aRect, // Rectangle in which text is to be drawn
DT_SINGLELINE| // Text format - single line
DT_CENTER| // - centered in the line
DT_VCENTER); // - line centered in aRect

EndPaint(hWnd, &PaintSt); // Terminate window redraw operation
return 0;

case WM_DESTROY: // Window is being destroyed
PostQuitMessage(0);
return 0;

default: // Any other message - we don't want to know,
// so call default message processing
return DefWindowProc(hWnd, message, wParam, lParam);
}
}

Jacob




 
 
Bertel Brander (22-01-2005)
Kommentar
Fra : Bertel Brander


Dato : 22-01-05 20:10

Jacob Jensen wrote:
> Nu har jeg forsøgt at lege en lille smule med et simpelt windowsprogram. Et
> sted har jeg linjen:
>
> WindowClass.hbrBackground = static_cast<HBRUSH>(GetStockObject(GRAY_BRUSH));
>
> Når jeg oversætter programmet med minGW-oversætteren (http://www.mingw.org/)
> sker følgende:
>
>
>>g++ test.cpp -o test
>
> C:\DOCUME~1\Jacob\LOCALS~1\Temp/ccyiaaaa.o(.text+0x74):test.cpp: undefined
> reference to `GetStockObject@4'
> C:\DOCUME~1\Jacob\LOCALS~1\Temp/ccyiaaaa.o(.text+0x1c1):test.cpp: undefined
> reference to `SetBkMode@8'

Du skal linke med Gdi32.lib, med gcc kompilere hedder den libgdi32.a
Du kan gøre det ved at tilføje -lgdi32 til kommando-linien

--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen

Bertel Brander (22-01-2005)
Kommentar
Fra : Bertel Brander


Dato : 22-01-05 20:15

Bertel Brander wrote:
> Du skal linke med Gdi32.lib, med gcc kompilere hedder den libgdi32.a
> Du kan gøre det ved at tilføje -lgdi32 til kommando-linien

For at foregribe eventuelle spørgsmål:
g++ test.cpp -lgdi32.lib -o test.exe

Og ikke:
g++ -lgdi32.lib test.cpp -o test

--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen

Jacob Jensen (22-01-2005)
Kommentar
Fra : Jacob Jensen


Dato : 22-01-05 21:06

> For at foregribe eventuelle spørgsmål:
> g++ test.cpp -lgdi32.lib -o test.exe

Kun det her virker hos mig:

g++ test.cpp -lgdi32 -o test

Måske et tamt spørgsmål men (jeg antager at -l betyder "link") hvor gdi32
når biblioteket hedder libgdi32.a?

Tak for hjælpen

Jacob



Bertel Brander (22-01-2005)
Kommentar
Fra : Bertel Brander


Dato : 22-01-05 21:32

Jacob Jensen wrote:
>>For at foregribe eventuelle spørgsmål:
>>g++ test.cpp -lgdi32.lib -o test.exe
>
>
> Kun det her virker hos mig:
>
> g++ test.cpp -lgdi32 -o test

Ja, min fejl.
Jeg ville dog bruge -o test.exe for at få den til at kalde
porgrammet for test.exe og ikke text (eller er det .exe som
standard med MinGW ?)

> Måske et tamt spørgsmål men (jeg antager at -l betyder "link") hvor gdi32
> når biblioteket hedder libgdi32.a?

Ja, -l betyder link og gdi32 betyder at den skal linke med libgdi32.a
Man kan også bruge:

g++ text.cpp G:\Win32App\mingw\lib\libgdi32.a -o test.exe

Men så skal man (som du ser) angive den fulde sti.


--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen

Jacob Jensen (22-01-2005)
Kommentar
Fra : Jacob Jensen


Dato : 22-01-05 21:57

> Jeg ville dog bruge -o test.exe for at få den til at kalde
> porgrammet for test.exe og ikke text (eller er det .exe som
> standard med MinGW ?)

I windows er det tror jeg (her er det i hvert fald).

Jacob



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408927
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste