Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

02.02.2008, 12:18

LPCWSTR, wchar_t, char* usw. Problem/Fragen

hi ;)


mich würde mal interessieren, was es mit diesem LPCWSTR auf sich hat.

seitdem ich express 2005 verwende, meckert der bei recht vielen funktionen immer, dass ein LPCWSTR erwartet wird, obwohl das früher mit nem normalen string, oder dem alten c string (char*, char[]) ganz normal funktionierte.

und weil ich grad noch am anfang meines "projektes" bin, würd mich gleich interessieren, ob man das doch irgendwie wieder vereinfachen kann, weil das sonst ein ziemlicher tippaufwand ist mit viel mehr funktionsaufrufen, als wenn es normal gehen würde.


als bsp. meine 2 soundfunktionen, die einen sound starten und wieder beenden (entweder music, die läuft im hintergrund ab) oder ein effekt (auf diesen wird gewartet bis er fertig abgespielt wurde).

im prinzip wären das grob gesagt nur 3 zeilen:

den orderstring mittels sprintf( das anscheinend veraltet ist:) ) generieren und mit mciSendString dann den erstellten orderstring senden.

C-/C++-Quelltext

1
2
3
mciSendString( L"open \"Irgendwas..mp3\" alias bla wait", 0, 0, 0);
mciSendString( L"play bla from 0", 0, 0, 0);
mciSendString( L"close bla", 0, 0, 0);


jetzt wollte ich ebene die strings mit sprintf generieren, was schon mal nicht ging, weil LPCWSTR erwwartet wird.
also bischen gegoogeld und dann irgendwie ne recht umständliche lösung irgendwie gefunden.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/*
 * function: void SoundPlay( char* stFileName, int iType, bool bRepeat )
 *
 * parameters:  - takes FilePath, Type of music and should the sound repeat
                - 0 = Music
                - 1 = Effekt*/
void SoundPlay( char* stFileName, int iType, bool bRepeat )
{
    // Variables

    wchar_t stOrder[50];
    char* stType;
    char buffer[50];

    if( iType )
        // Effect

        stType = "Effect";
    else
        // Music

        stType = "Music";

    std::sprintf( buffer, "open \"Sounds\\%s.mp3\" alias %s wait", stFileName, stType );
    std::mbstowcs( stOrder, buffer, sizeof(buffer) );
    mciSendString( stOrder, 0, 0, 0);
    // Check if sound should be repeated

    if( bRepeat )
        // Repeat sound

        std::sprintf( buffer, "play %s from 0 repeat", stType );
    else if( iType )
        // Effect sound - wait

        std::sprintf( buffer, "play %s from 0 wait", stType );
    else
        // music - Do not repeat

        std::sprintf( buffer, "play %s from 0", stType );

    std::mbstowcs( stOrder, buffer, sizeof(buffer) );
    mciSendString( stOrder, 0,0,0);
}   // endfunction: SoundPlay




/*
 * function: void SoundStop( int iType )
 *
 * parameters:  - takes Type of music
                - 0 = Music
                - 1 = Effekt*/
void SoundStop( int iType )
{
    // Variables

    wchar_t stOrder[50];
    char* stType;
    char buffer[50];

    if( iType )
        // Effect

        stType = "Effect";
    else
        // Music

        stType = "Music";

    std::sprintf( buffer, "close %s", stType );
    std::mbstowcs( stOrder, buffer, sizeof(buffer) );
    mciSendString( stOrder, 0,0,0); 
}   // endfunction: SoundStop


so sieht das jetzt aus.
ich brauch ein char array und ein wchar_t array (alteernativ auch char* und wchar_t*, aber dann wird das noch länger und umständlicher) und 2 funktionen
sprintf und mbstowcs.

ich weiß ja nicht,wie ihr das seht, aber irgendwie find ich das einfach unsauber.

gut wäre es,wenn es sowas gäbe wie

C-/C++-Quelltext

1
2
3
4
LPCWSTR bla;

sprintf( bla, L"unsere order wird zusammengebaut" );
mciSendString( bla, 0,0,0 );


kennt jemand ne lösung dafür oder einen besseren weg?

mfg
Simon


P.S.: hoffe ich hab mich klar genug ausgedrückt, was ich eigentlich will :)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

02.02.2008, 12:25

Wie wärs mit swprintf?
@D13_Dreinig

3

02.02.2008, 12:59

Also, vllt. hast du ja schonmal etwas von UNICODE gehört. Ab VC++2005 ist das der Standardzeichensatz. Das kannst du aber in den Optionen umstellen. UNICODE ist nur, wenn du Programme für viele Sprachen schreiben willst, vllt. schon vom Vorteil ... deswegen stelle entweder alles auf UNICODE um, oder nimm die Datentypen aus <tchar.h>, TCHAR, LPTSTR, LPTCSTR usw. Diese sind abhängig von Unicode (#if _UNICODE) wchar_t oder char.

C-/C++-Quelltext

1
2
3
4
5
#if _UNICODE
typedef wchar_t TCHAR;
#else // !UNICODE

typedef char TCHAR;
#endif // UNICODE

Auch die Funktionen von Microsoft, die in irgendeiner weise mit Strings arbeiten, sind mittlerweile für ASCII und UNICODE ausgelegt. Ein Makro das sich, ja nach Unicode aktiviert oder nicht, nach funcnameW oder funcnameA. W für WideString, A für AnsiString.

C-/C++-Quelltext

1
2
3
4
LPTSTR lpString(new TCHAR[256]());
_sntprintf(lpString, 256, "Pumukel");
MessageBox(NULL, lpString, 0, 0);
delete [] lpString;
Würde nun Funktionieren, ob nun Unicode aktiviert ist, oder nicht.

naja nen bissel vereinfacht erklärt aber es sollte dir die Idee dahinter ein wenig näher bringen ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

4

02.02.2008, 16:17

k danke :)

hab jetzt aber noch ein problem mit der express edition (irgendwie macht die mehr probleme, als dass sie vorteile bringt:P).

wenn ich meine "anwendungen" auf nem anderen computer starten will, kommt.

Zitat

die anwendungskonfiguration ist nicht korrekt


mit googeln bin ich auf folgendes gestoßen

http://www.codeproject.com/KB/cpp/vcredists_x86.aspx

man müsste sich also irgendwie was zusammenbasteln, dass bei nem anderen computer die benötigten anforderungen abgefragt werden und eventuell mitinstalliert werden.

da ich es eigentlich nicht jedem antun will, dass er irgendwas auf seinem computer toll installieren muss (man weiß ja nie so genau, was einem da alles mitgeliefert wird), wollte ich fragen ob es ne alternative gibt.

beim normalen visual c++ 6.0 wars so, dass am anfang nur so ein warntext kam

Zitat


diese anwendung ist nicht für die weiterverbreitung erlaubt und blablabla


irgendsowas. jedoch ist der unterschied,dass diese anwendungen auf anderen computern problemlos liefen :(

5

02.02.2008, 16:47

Da fehlt wahrscheinlich eine msvcr80.dll. Oder eine d3dx9_3x.dll. Wobei das x für eine Zahl steht, die abhhängig von deinem DX-SDK ist. d3dx9_34.dll ist es beispielsweise bei mir für die Juni 2007 Ausgabe.

6

02.02.2008, 16:55

ne is nur ne normale konsolenanwendung.

hab da alles gezipped,was im projektordner war, aber hat nichts gebracht.

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

7

02.02.2008, 16:57

http://spieleprogrammierer.de/phpBB2/viewtopic.php?t=4926

8

02.02.2008, 16:58

Verstehe. Aber die DLLs befinden sich ja meistens irgendwo anders als in deinem Projektordner. Z.B. Windows\System32 oder unter den Pfaden der Umgebungsvariable $Path

EDIT:
Dürfte sich mit dem Post von rewb0rn dann hoffentlich erledigt haben... :)

9

02.02.2008, 18:56

danke reb0rn

hatte nach anwendungskonfiguration gesucht, da hat das forum nichts ausgespuckt ;)

edit: k hab jetzt so ne manifestdatei und die auch angegeben, dass die zusätzlich verwendet werden soll.


das ergebnis: eine weitere fehlermeldung, jedoch schon innerhalb der konsole :)

Zitat


Das angegebene Programm kann nicht ausgeführt werden"


irgendwie scheint das vermutlich mit der manifestdatei nicht richtig funktionieren.

bei mir sieht die atm so aus:

Zitat


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Copyright © 1981-2001 Microsoft Corporation -->
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<noInheritable/>
<assemblyIdentity
type="win32"
name="Microsoft.VC80.DebugCRT"
version="8.0.50608.0"
processorArchitecture="x86"
publicKeyToken="1fc8b3b9a1e18e3b"
/>
<file name="msvcr80d.dll"/>
<file name="msvcp80d.dll"/>
<file name="msvcm80d.dll"/>
</assembly>


die 3 dlls sind im rodner, die "Microsoft.VC80.DebugCRT.manifest" ist auch im projekt und mit dem manifesttool -> eingabe/ausgabe -> zusältzich angegeben.

hier ein screen:

(Link)

Werbeanzeige