windows - char array til LPCTSTR konvertering i c

Indlæg af Hanne Mølgaard Plasc

Problem



Er der nogen der ved, hvordan man konverterer et char array til en LPCTSTR i c?


Redigere:


For mere reference skal jeg tilføje et helt tal til en streng og konvertere den pågældende streng til LPCTSTR for den første parameter i Windows-funktionen CreateFile ().


Dette er det hardkodede eksempel, som jeg bruger i øjeblikket, men jeg skal kunne passere i et hvilket som helst nummer, der skal bruges som portnummer.


CreateFile(\_T("\\.\COM11")... //hardcoded for com port 11


og her er flere ting, jeg har prøvet, hvilket jeg tror omfatter følgende forslag til de næste 2 svar på dette indlæg. De arbejder desværre ikke. Hvis nogen kunne påpege noget, jeg har gjort forkert og muligvis kunne løse mit problem, værdsætter jeg det.


Alle disse eksempler antager, at portNum er et int, der allerede er tildelt en gyldig værdi


1



char portName[12] = { 0 };

sprintf\_s( portName, sizeof( portName ), "\\.\COM\%i", portNum );

CreateFile(portName...


Jeg har også prøvet # 1 med en LPCSTR sag for hvad det er værd ...


2



LPCSTR SomeFunction(LPCSTR aString) {
    return aString;
}

main() {

char portName[12] = { 0 };
sprintf\_s( portName, sizeof( portName ), "\\.\COM\%i", portNum );

LPCSTR lpPortName = SomeFunction(portName);

CreateFile(lpPortName...


3



const char * portName = "";
sprintf\_s( portName, sizeof( portName ), "\\.\COM\%i", portNum );

LPCSTR lpPortName = portName;

CreateFile(lpPortName...

Bedste reference


Du kan implicit konvertere en char array til en LPCSTR uden nogen casts:


void SomeFunction(LPCSTR aString);
...
char myArray[] = "hello, world!";
SomeFunction(myArray);


En LPCSTR er en Windows typedef for en lang pointer til en konstant streng. Tilbage i de mørke dage i Win16-programmeringen var der forskellige typer pointers: nær pointers og langt pointers, nogle gange også kendt som kort og < em> lange pegere. Nærliggende pointers kunne kun pege på et 64KB segment af hukommelse bestemt af et af x86 segmentregistre. Langt pointere kunne pege på noget. I dag i Win32 med virtuel hukommelse er der ikke brug for nærliggende pointers - alle pointers er lange.


Så, en LPSTR er en typedef for en char * eller en peger på en streng. En LPCSTR er versionen const, dvs. det er en typedef for en const char *. I C falder arrays i pointers til deres første elementer, så en char[] falder ind i en char*. Endelig kan enhver form for 'pointer til T' (for enhver type T) implicit omdannes til en 'peger til const T'. Ved at kombinere disse tre fakta ser vi således, at vi implicit kan omdanne en char[] til en LPCSTR.





Som svar på din redigering vil jeg gætte at du kompilerer et Unicode-program. Hvis du ser omhyggeligt på dokumentationen for CreateFile(), vil du bemærke, at filnavnparametret faktisk er en LPCTSTR, ikke en LPCSTR (bemærk T). [50]


For stort set hver Win32-funktion, der tager et argument af en bestemt strengtype (måske indirekte, dvs. som et medlem af en struktur, der er bestået som parameter), er der faktisk to versioner af den funktion: en som tager 8 bit ANSI-strings og en, der tager 16-bit brede tegnstrenge. For at få de faktiske funktionsnavne tilføjer du en A eller en W til funktionsnavnet. Så er ANSI-versionen af ​​CreateFile() navngivet CreateFileA(), og den brede tegnversion hedder CreateFileW(). Afhængigt af om du kompilerer med Unicode (dvs. om præprocessorsymbolet \_UNICODE er defineret), er symbolet CreateFile #define d til enten CreateFileA eller [[CreateFileW som det er hensigtsmæssigt og ligeledes for hver anden funktion, der har en ANSI og en bred karakterversion.


På samme måde er typen TCHAR typedef ed til enten char eller wchar\_t, afhængigt af om Unicode er aktiveret, og LPCTSTR er typedef ed til en peger til en const TCHAR.


For at gøre din kode korrekt skal du erstatte de strenge, du bruger igen med TCHAR strenge, og brug den typegeneriske version af sprintf\_s, \_stprintf\_s:


TCHAR portName[32];
\_stprintf\_s(portName, sizeof(portName)/sizeof(TCHAR), \_T("\\.\COM\%d"), portNum);
CreateFile(portName, ...);


Alternativt kan du eksplicit bruge ANSI- eller brede tegnversioner af alt:


// Use ANSI
char portName[32];
sprintf\_s(portName, sizeof(portName), "\\.\COM\%d", portNum);
CreateFileA(portName, ...);

// Use wide-characters
wchar\_t portName[32];
swprintf\_s(portName, sizeof(portName)/sizeof(wchar\_t), L"\\.\COM\%d", portNum);
CreateFileW(portName, ...);

Andre referencer 1


I hvilket format er din char array?


Er det en const char[] eller en non-const?


LPCSTR er bare det (noget) forvirrende Microsoft navn for 'Long Pointer to Constant String'.


LPCSTR bar = "hello";
const char *foo = bar;

const char *evil = "hello";
LPCSTR sauron = evil;


Hvis du har brug for at få en non-const-version, skal du enten kaste bort constnessen, eller du kopierer til et nyt array. Jeg ville nok foretrække sidstnævnte. Variabler er ofte konst for en grund, og at ændre dem er næsten altid dårlig praksis.

Andre referencer 2


prøv sådan dette .........


TCHAR *pcCommPort = TEXT("COM1");
HANDLE h = CreateFile(pcCommPort,other arguments);

Andre referencer 3


Du har strengfunktioner til TCHAR. Du kan f.eks. Bruge stprintf\_s til at acceptere TCHAR. På denne måde gør du koden 'uafhængig' af unicode eller multi-byte tegn sæt.


Din kode (variant 1) bliver:


TCHAR portName[12] = { 0 };

stprintf\_s( portName, sizeof( portName ) / sizeof(TCHAR), \_T("\\.\COM\%i"), portNum );

CreateFile(portName...

Andre referencer 4


'Er der nogen der ved, hvordan man konverterer et char array til en LPCSTR i c?'


Du behøver ikke at gøre noget overhovedet. Det konverteres automatisk til den type (undtagen i initialisatorer og sizeof).


'CreateFile (portnavn ...'


Måske skal du fortælle os den fejlmeddelelse, som VC ++ giver dig på kompileringstidspunktet?


Måske skal du også fortælle os, hvilken fejlmeddelelse VC ++ gav dig, da Adam Rosenfields whcar\_t version ikke fungerede for dig?

Andre referencer 5


Jeg er ikke sikker på, om du figurerede noget ud i slutningen, men jeg havde det samme problem og følgende fungerede godt for mig:


int  comPortNum = 5;
char comPortName[32];
sprintf((LPTSTR)comPortName, TEXT("\\.\COM\%d"), comPortNum);
HANDLE h = CreateFile(comPortName,other arguments);

Andre referencer 6


char* filename;
LPCTSTR ime = CA2W(filename);


Dette er String Conversion Macro og fungerer på min VS12

Andre referencer 7


Det er et gammelt klassisk spørgsmål. Jeg bruger det i UNICODE.


char *pChar = "My Caption of My application";
    WCHAR wsz[512];
    swprintf(wsz, L"\%S", pChar);
    SetWindowText(hWnd,         // ウィンドウまたはコントロールのハンドル
        wsz   // タイトルまたはテキスト
    );