Avatar billede ladyhawke Novice
01. juli 2002 - 12:57 Der er 40 kommentarer og
1 løsning

Hvordan kan jeg bruge AfxMessageBox og CString

Jeg har et program i Visual C++(6) som skal bruge AfxMesssageBox og CString, men compileren påstår de ikke findes. Hvad mangler der?
Avatar billede jpk Nybegynder
01. juli 2002 - 13:03 #1
#include <afx.h>
Avatar billede jpk Nybegynder
01. juli 2002 - 13:04 #2
Måske #include <afxwin.h> for AfxMessageBox...
Avatar billede ladyhawke Novice
01. juli 2002 - 13:07 #3
Jeg får følgende fejl hvis jeg inkluderer afx.h, men jeg kan stadig ikke kalde AfxMessageBox. Jeg kan godt kalde MessageBox, men jeg ved ikke hvordan jeg får sat teksterne i boksen (kan heller ikke kalde CString)

fatal error C1189: #error :  WINDOWS.H already included.  MFC apps must not #include <windows.h>
Avatar billede jpk Nybegynder
01. juli 2002 - 13:13 #4
Er det ikke et MFC-projekt?

Project->Settings, fanebladet General, den øverste combobox skal enten være "Use MFC in a shared DLL" eller "Use MFC in a static library"
Avatar billede ladyhawke Novice
01. juli 2002 - 13:18 #5
Den er sat til "Use MFC as shared DLL", men jeg får alligevel "undeclared identifier" hvis jeg forsøger at oprette f.eks. en CString
Avatar billede jpk Nybegynder
01. juli 2002 - 13:25 #6
Har du en stdafx.h i dit projekt og included den?
Avatar billede ladyhawke Novice
01. juli 2002 - 13:28 #7
ja...
Jeg forstår ikke hvad der er galt, for de andre programmer jeg har lavet fungerer fint, men dette er en wizard (ikke standard), men derfor skulle man da sagtens kunne bruge MFC alligevel...
Avatar billede jpk Nybegynder
01. juli 2002 - 13:32 #8
Ja, hvis du vil kan du maile mig dit projekt, så skal jeg kigge på det...
jacpost@post6.tele.dk
Avatar billede ladyhawke Novice
01. juli 2002 - 13:40 #9
Det kan jeg ikke, det meste af koden er ikke offentlig tilgængelig...

Jeg kan fortælle dig hvilke includes der er og diverse indstillinger:
Hovedfilen:
  #include "stdafx.h"
  #include "ServerMIDL.h" (wizard genereret)
  #include "ServerName_Test3_Class.h" (wizard genereret header til hovedfilen)

Jeg må indrømme jeg er lidt på bar bund, for de andre ting jeg har lavet f.eks. almindelig dialog app. virker fint, med stort set samme includes...
Avatar billede jpk Nybegynder
01. juli 2002 - 13:55 #10
Hvordan ser din stdafx.h ud?
Avatar billede ladyhawke Novice
01. juli 2002 - 14:01 #11
// stdafx.cpp : source file that includes just the standard includes
//  stdafx.pch will be the pre-compiled header
//  stdafx.obj will contain the pre-compiled type information

#include "stdafx.h"

#ifdef _ATL_STATIC_REGISTRY
#include <statreg.h>
#include <statreg.cpp>
#endif

#include <atlimpl.cpp>
Avatar billede ladyhawke Novice
01. juli 2002 - 14:11 #12
Beklager, ovenstående var stdafx.cpp.
Her er stdafx.h

// stdafx.h : include file for standard system include files,
//      or project specific include files that are used frequently,
//      but are changed infrequently

#if !defined(AFX_STDAFX_H__5ECE6DC8_2145_41ED_00BC_5235A4A9AF8A__INCLUDED_)
#define AFX_STDAFX_H__5ECE6DC8_2145_41ED_00BC_5235A4A9AF8A__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define STRICT
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif

//We don't normally need to know each function selected for inlining.
#pragma warning( disable: 4711 )

//Without any definition, we default to MTA
//#define _ATL_APARTMENT_THREADED

#include <atlbase.h>
#include "ServerExternal.h"
#include <atlcom.h>


//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STDAFX_H__5ECE6DC8_2145_41ED_00BC_5235A4A9AF8A__INCLUDED)
Avatar billede jpk Nybegynder
01. juli 2002 - 14:22 #13
Har du prøvet at include afxwin.h (#include <afxwin.h>) i stdafx.h?
Avatar billede ladyhawke Novice
01. juli 2002 - 14:31 #14
Næh, men hvis jeg gør (har lige prøvet) får jeg denne fejl:

c:\program files\microsoft visual studio\vc98\mfc\include\afxv_w32.h(14) : fatal error C1189: #error :  WINDOWS.H already included.  MFC apps must not #include <windows.h>
Avatar billede jpk Nybegynder
01. juli 2002 - 14:35 #15
Du må på en eller anden måde have included Windows.h, evt. via en anden include..!
Avatar billede ladyhawke Novice
02. juli 2002 - 07:48 #16
Det er meget muligt, men det ændrer ikke på at jeg ikke kan lave en AfxMessageBox og en CString...

Kan man eventuelt bruge MessageBox (er kendt på kompileringstidspunktet) og i så fald hvordan får jeg fyldt tekst i den?
Avatar billede jpk Nybegynder
02. juli 2002 - 08:45 #17
Prototypen er:

int MessageBox(
  HWND hWnd,          // handle to owner window
  LPCTSTR lpText,    // text in message box
  LPCTSTR lpCaption,  // message box title
  UINT uType          // message box style
);

Ex.:
MessageBox(NULL, "Klik på knappen til højre for ...", "Info", MB_ICONINFORMATION);

Hvad mener du med "er kendt på kompileringstidspunktet"?
Avatar billede ladyhawke Novice
02. juli 2002 - 08:57 #18
Når jeg sagde kendt på kompileringstidspunktet, så mener jeg at når der kompileres for jeg ikke "undeclared identifier" eller lignende fejl, men hvis jeg bruger dit eksempel (har selv prøvet noget lignende) får jeg dette resultat:

error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'char [34]' to 'const unsigned short *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

NB det er ikke fordi jeg har stavet MessageBox forkert...
Avatar billede jpk Nybegynder
02. juli 2002 - 09:04 #19
Prøv at sætte :: foran, altså ::MessageBox(...);
Avatar billede ladyhawke Novice
02. juli 2002 - 09:07 #20
Det giver samme fejl...

Hvad giver det i øvrigt (::) ?
Avatar billede jpk Nybegynder
02. juli 2002 - 09:10 #21
Funktionen MessageBox er definere flere steder, bl.a. i klasserne CWindow og CWnd (MFC) og også under global namespace. :: betyder at du vil anvende den der er defineret under global namespace.
Avatar billede jpk Nybegynder
02. juli 2002 - 09:15 #22
Virker den heller ikke således?

MessageBox(NULL, (LPCTSTR)"Klik på knappen til højre for ...", (LPCTSTR)"Info", MB_ICONINFORMATION);
Avatar billede ladyhawke Novice
02. juli 2002 - 09:16 #23
OK, men hvordan kan det være at jeg får de type cast fejl når jeg kalder MessageBox?

Mit tool tip siger at den skal se således ud:

int __cdecl MessageBox(HWND, unsigned short *, unsigned short *, unsigned int)

Men hvordan sætter jeg tekst i den udgave...
Avatar billede ladyhawke Novice
02. juli 2002 - 09:21 #24
Der kommer ikke compiler fejl med:
MessageBox(NULL, (LPCTSTR)"Klik på knappen til højre for ...", (LPCTSTR)"Info", MB_ICONINFORMATION);

men når boxen vises er teksten bare firkanter og et enkelt "."
Avatar billede jpk Nybegynder
02. juli 2002 - 09:23 #25
Argument numnmer 2 og 3 er af typen LPCTSTR, som egentlig er en pointer...
Avatar billede jpk Nybegynder
02. juli 2002 - 09:29 #26
Hvad er resultatet med:
MessageBox(NULL, L"Klik på knappen til højre for ...", L"Info", MB_ICONINFORMATION);
Avatar billede ladyhawke Novice
02. juli 2002 - 09:43 #27
Det virker !! Hvordan hænger det sammen ???? Hvad gør L foran strengene?
Avatar billede jpk Nybegynder
02. juli 2002 - 09:50 #28
Okay, det er fordi du bruger et 16-bit karakter sæt!!!
Når du prefixer teksten med L, fortæller du compileren at der er tale om wide character.
Det tyder på du kompilerer til unicode...
Avatar billede ladyhawke Novice
02. juli 2002 - 09:57 #29
hmm... Tjah det er ikke noget jeg har bedt om bevidst, men garanteret baseret på wizarden.

Hvilke begrænsninger/muligheder giver det? (bare i store træk...)
Avatar billede jpk Nybegynder
02. juli 2002 - 10:02 #30
Det biver muligheden for at bruge karaktersæt der ikke kan beskrives i 8 bit. det er egentlig en god skik altid at anvende L før en tekst, da koden så også kan kompileres som unicode.
Når man vælger at bruge unicode, fylder programmet en lille smule mere i memory, da der anvendes 16 bit for hver karakter og ikke 8. Det er dog ikke noget du skal bekymre dig om...
Avatar billede ladyhawke Novice
02. juli 2002 - 10:06 #31
Det vil sige at det ikke har indflydelse på problemet med CString og AfxMessageBox eller...
Avatar billede jpk Nybegynder
02. juli 2002 - 10:11 #32
Både CString og AfxMessageBox understøtter unicode...

Har du en #define _UNICODE nogen steder i dit projekt?
Avatar billede ladyhawke Novice
02. juli 2002 - 10:15 #33
Jeg prøvede en "find in files" og den kunne ikke finde den.

Hvor skal den stå i så fald og hvilken betydning har den...
Avatar billede jpk Nybegynder
02. juli 2002 - 10:37 #34
Det fortæller compileren at det skal kompileres som unicode.

Du kan også checke under Project->Settings, fanebladet C++, kategori General i feltet Preprocessor definitions.
Avatar billede ladyhawke Novice
02. juli 2002 - 10:46 #35
Der står blandt andet "_UNICODE,UNICODE" i preprocessor definitions...

Vil det hjælpe at fjerne dem (mht. de funtioner jeg ikke kan kalde)
Avatar billede jpk Nybegynder
02. juli 2002 - 10:59 #36
Det burde ikke gøre nogen forskel, men du kan jo prøve at se hvad der sker...
Avatar billede ladyhawke Novice
02. juli 2002 - 11:10 #37
Hvis jeg fjerner unicode definitionerne får jeg en masse fejl...

Jeg har følgende project options, kan jeg ikke slette noget af det?
/nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_WINDLL" /D "_USRDLL" /D "_UNICODE" /D "UNICODE" /FR"Test3___Win32_Debug/" /Fp"Test3___Win32_Debug/Test3.pch" /Yu"stdafx.h" /Fo"Test3___Win32_Debug/" /Fd"Test3___Win32_Debug/" /FD /GZ /c
Avatar billede jpk Nybegynder
02. juli 2002 - 11:18 #38
Jo, det kan du godt, men det er jo alle valide parametre der giver mening!
Du kan slå dem op i MSDN og se hvad de betyder.
Avatar billede ladyhawke Novice
02. juli 2002 - 11:51 #39
Det ser som ventet ikke ud til at have den store effekt...

Det er også lige meget i denne sammenhæng, du har i hvert fald fortjent pointene :-)
Avatar billede jpk Nybegynder
02. juli 2002 - 11:59 #40
Jeg takker.

Hvis du støder på problemet igen, i et projekt du gerne må "dele ud", kan vi jo tage det op igen!
Avatar billede ladyhawke Novice
02. juli 2002 - 12:47 #41
Det skal jeg nok :-) Hvis jeg finder en løsning skal jeg også nok vende tilbage...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester