[win32 api] Variable in MessageBox

10/14/2009 22:00 | Moep |#1
geht:
Code:
#include <windows.h>  

int WINAPI WinMain( HINSTANCE, HINSTANCE, PSTR, int )
{
	MessageBox(NULL,L"Text", L"Titel",MB_OK);
	return 0;
}
geht nicht:
Code:
#include <windows.h>  

int WINAPI WinMain( HINSTANCE, HINSTANCE, PSTR, int )
{
	char text[10] = "Text";
	char titel[10] = "Titel";
	MessageBox(NULL,text, titel,MB_OK);
	return 0;
}
In diversen (veralteten?) Tutorials wird mir gesagt dass das gehen sollte. [Only registered and activated users can see links. Click Here To Register...]

Google hat mich auf sprintf und CString hingewiesen, bekomme aber immer die Fehlermeldung: cannot convert parameter x from 'char [x]' to 'LPCWSTR'. Wie muss die convertierung korrekt aussehen?

Ich nutze VS2008 pro, ist der in dem Tutorial genutzen Visual C++6 Compiler eventuell der prägnante Unterschied?

Thx 4 Help.
10/14/2009 22:04 Adroxxx#2
Machste halt als LPCWSTR und nicht als char.
10/14/2009 22:17 MrSm!th#3
ich kenne das
Das hasse ich, die ganzen Tutorials die ich kenne sind mit VS6 und gerade da gehen Dinge, die ich nicht so nachbauen kann.
Andererseits ist es gut, so trainiere ich Kreativität und meine programming skills xD

folgendes soll angeblich gehen (windows 98 und VS 6 zeit), geht aber mit VS 2008 nicht:

Code:
WinExec(m_strList1, SW_NORMAL);
m_strList1 ist der Value der Auswahl in einem Listenfeld

oder folgendes:

Code:
   if((m_bCheck1==TRUE) && (m_bCheck2==TRUE)) m_ctlList1.Dir ( DDL_HIDDEN | DDL_EXCLUSIVE, m_strCombo1+"\\*.exe");
da gibt mir VS den Fehler dass man keine 2 Strings addieren kann =(
naja so musste ich ein bisschen improvisieren.
10/14/2009 22:26 Akorn#4
Quote:
Originally Posted by xhelloselm View Post
ich kenne das
Das hasse ich, die ganzen Tutorials die ich kenne sind mit VS6 und gerade da gehen Dinge, die ich nicht so nachbauen kann.
Andererseits ist es gut, so trainiere ich Kreativität und meine programming skills xD

folgendes soll angeblich gehen (windows 98 und VS 6 zeit), geht aber mit VS 2008 nicht:

Code:
WinExec(m_strList1, SW_NORMAL);
m_strList1 ist der Value der Auswahl in einem Listenfeld
Nunja wen man sich mal ankuckt was in der msdn über WinExec steht dan findet man auch die warscheinliche ursache
Quote:
This function is provided only for compatibility with 16-bit Windows
10/14/2009 22:28 | Moep |#5
Quote:
Originally Posted by Adroxxx View Post
Machste halt als LPCWSTR und nicht als char.
schon probiert ;)

Code:
LPCWSTR text[10] = "Text";
Fehlermeldung: error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'LPCWSTR [10]' to 'LPCWSTR'

Edit//: so gehts
Code:
#include <windows.h>  

int WINAPI WinMain( HINSTANCE, HINSTANCE, PSTR, int )
{
	char text[10] = "Text";
	char titel[10] = "Titel";
	MessageBox(NULL,(LPCWSTR)text, (LPCWSTR)titel,MB_OK);
	return 0;
}
10/14/2009 22:42 Akorn#6
PHP Code:
#include <windows.h>


int WINAPI WinMainHINSTANCEHINSTANCEPSTRint )
{
    
LPCTSTR text "Text";
    
LPCTSTR  titel "Titel";
    
MessageBox(NULL,texttitel,MB_OK);
    return 
0;

oh hab das EDIT übersehen.
10/14/2009 22:44 | Moep |#7
Quote:
Originally Posted by Akorn View Post
PHP Code:
#include <windows.h>


int WINAPI WinMainHINSTANCEHINSTANCEPSTRint )
{
    
LPCTSTR text "Text";
    
LPCTSTR  titel "Titel";
    
MessageBox(NULL,texttitel,MB_OK);
    return 
0;


Da hat mein Compiler was dagegen ;)
10/14/2009 22:47 link#8
Sieh halt, wie Adroxxx schon andeutete, in deinen Linker-Einstellungen nach, als was 'MessageBox' aufgelöst wird.
Wahrscheinlich wohl als 'MessageBoxW'..
Also würdest du dessen Parameter total verhauen (Titel vs T\0i\0t\0e\0l\0)

Code:
	WORD text[10] = L"Text";
	WORD titel[10] = L"Titel";
Das L muss vor die Stringkonstante, damit es auch als Unicode (2 Bytes, dafür WORD) abgelegt wird (s. oben).

'LPCWSTR text[10]' wäre ein Array aus Pointern zu Wide-Strings, das nicht viel am eigentlichen 2 Byte-Problem ändern würde..
10/14/2009 22:49 MrSm!th#9
Quote:
Originally Posted by Akorn View Post
Nunja wen man sich mal ankuckt was in der msdn über WinExec steht dan findet man auch die warscheinliche ursache
nunja aber laut Tutorial geht es xD ich kenne die Ursache selbst
10/14/2009 23:08 | Moep |#10
Quote:
Originally Posted by link View Post
Sieh halt, wie Adroxxx schon andeutete, in deinen Linker-Einstellungen nach, als was 'MessageBox' aufgelöst wird.
Wahrscheinlich wohl als 'MessageBoxW'..
Also würdest du dessen Parameter total verhauen (Titel vs T\0i\0t\0e\0l\0)

Code:
	WORD text[10] = L"Text";
	WORD titel[10] = L"Titel";
Das L muss vor die Stringkonstante, damit es auch als Unicode (2 Bytes, dafür WORD) abgelegt wird (s. oben).

'LPCWSTR text[10]' wäre ein Array aus Pointern zu Wide-Strings, das nicht viel am eigentlichen 2 Byte-Problem ändern würde..
geht nicht
Code:
#include <windows.h>  

int WINAPI WinMain( HINSTANCE, HINSTANCE, PSTR, int )
{
	WORD text[10] = L"Text";
	WORD titel[10] = L"Titel";
	MessageBox(NULL,(LPCWSTR)text, (LPCWSTR)titel,MB_OK);
	return 0;
}
geht ebenso nicht
Code:
#include <windows.h>  

int WINAPI WinMain( HINSTANCE, HINSTANCE, PSTR, int )
{
	WORD text[10] = L"Text";
	WORD titel[10] = L"Titel";
	MessageBox(NULL,text, titel,MB_OK);
	return 0;
}
geht
Code:
#include <windows.h>  

int WINAPI WinMain( HINSTANCE, HINSTANCE, PSTR, int )
{
	wchar_t text[10] = L"Text";
	wchar_t titel[10] = L"Titel";
	MessageBox(NULL,(LPCWSTR)text, (LPCWSTR)titel,MB_OK);
	return 0;
}
geht auch
Code:
#include <windows.h>  

int WINAPI WinMain( HINSTANCE, HINSTANCE, PSTR, int )
{
	wchar_t text[10] = L"Text";
	wchar_t titel[10] = L"Titel";
	MessageBox(NULL,text, titel,MB_OK);
	return 0;
}
Was hab ich gemacht? Wo ist der Unterschied, was davon ist die beste Lösung?
10/14/2009 23:11 Akorn#11
Quote:
Originally Posted by | Moep | View Post
Da hat mein Compiler was dagegen ;)
VS?
Ich habe es mit MinGW kompilieren können. Und es funkioniert auch.
10/14/2009 23:20 | Moep |#12
Quote:
Originally Posted by Akorn View Post
VS?
Ich habe es mit MinGW kompilieren können. Und es funkioniert auch.
Ja VisualStudio 2008 pro. Ich habe mich bisher noch nicht mit Linker Einstellungen beschäftigt und nutze eigentlich immer die voreingestellten.

@Adroxxx könntest du bitte den Tread Titel berichtigen :rolleyes:
10/14/2009 23:29 link#13
@| Moep |:
Das mit der Typenbezeichnung liegt wohl an STRICT (ich habe den C-, nicht den C++-Modus, benutzt).
10/15/2009 11:16 Adroxxx#14
Quote:
Originally Posted by | Moep | View Post
Ja VisualStudio 2008 pro. Ich habe mich bisher noch nicht mit Linker Einstellungen beschäftigt und nutze eigentlich immer die voreingestellten.

@Adroxxx könntest du bitte den Tread Titel berichtigen :rolleyes:
Kannst du nicht den Thread Titel selbst ändern ? Sollte eigentlich gehen :confused: . Naja wie soll ich ihn den ändern?

btw. [Only registered and activated users can see links. Click Here To Register...]