Strings mit mehreren '\0' inner Stringtable abspeichern...WIE?


  • Mod

    Der Standard CFileDialog verwendet das | Zeichen dafür und ersetzt diese durch das 0 Zeichen.

    Ansonsten selber genau so etwas machen:

    CString strFilter = _T("My Null|and a double one||";
    LPTSTR pch = strFilter.GetBuffer(0); // modify the buffer in place
    // MFC delimits with '|' not '\0'
    while ((pch = _tcschr(pch, _T('|'))) != NULL)
        *pch++ = '\0';
    

    BTW: Auch das geht und ist erlaubt:

    CString str = _T("TEST1");
    str += _T('\0');
    str += _T("TEST2");
    


  • geeky schrieb:

    Speicher doch statt \0 einfach \n und ersetze dann beim setzen des Filters für den Dialog das \n wieder durch \0.

    Danke für die Tipps,...aber das /\ hab ich mit nem '#'-Zeichen bereits probiert...das hat nicht funktioniert:

    OPENFILENAME ofnOpenFile;	 // CommonDlg-Struktur für 'Öffnen-Dialog'
    	TCHAR		 szSelectedFile[(MAX_PATH * 2) + 1]; // <- Ausgewählte, zu öffnende Datei
    
    	ZeroMemory(szSelectedFile, sizeof(TCHAR));
    	// Struktur für 'Öffnen-Dialog' füllen:
    	ZeroMemory(&ofnOpenFile, sizeof(OPENFILENAME));
    	ofnOpenFile.lStructSize	= sizeof(OPENFILENAME);
    	ofnOpenFile.hwndOwner	= hWnd;
    	// Resource-String laden (STR_FORMAT_FILE_APP_SUPPORT):
    	pszReSrcStr = GetResourceString(g_hmDllLang, STR_FORMAT_OPEN_FILE_SUPPORTED);
    	// nach '#'-Zeichen suchen und gegen Null-Terminierung ('\0') austauschen:
    	unsigned long ulCount;
    	for(ulCount = 0L; ulCount <= strlen(pszReSrcStr); ulCount++)
    	{
    		if(pszReSrcStr[ulCount] == '#')
    		pszReSrcStr[ulCount] = '\0';
    	}
    	ofnOpenFile.lpstrFilter	= pszReSrcStr; // <- Dateifilter
    	ofnOpenFile.lpstrFile	= szSelectedFile;
    	ofnOpenFile.nMaxFile	= (MAX_PATH * 2) + 1;
    	ofnOpenFile.Flags		= OFN_EXPLORER | OFN_FILEMUSTEXIST;
    	// Resource-String laden (STR_OPEN_FILE_DLG_CAPTION):
    	pszReSrcStr = GetResourceString(g_hmDllLang, STR_OPEN_FILE_DLG_CAPTION);
    	ofnOpenFile.lpstrTitle	= pszReSrcStr; // <- Titel des 'Öffnen-Dialog'
    	FreeResourceString(pszReSrcStr); // <- Speicher deallokieren
    	// Öffnen-Dialog aufrufen:
    	if(!GetOpenFileName(&ofnOpenFile))
    		break;
    

    Hier der Stringtable-Eintrag (STR_FORMAT_OPEN_FILE_SUPPORTED):

    StringTable schrieb:

    Alle unterstützten Medientypen#.mp3;.wav#Mp3-Audiodateien (.mp3)#.mp3#Wave-Audiodateien (.wav)#.wav##

    PS: @Martin Richter: Danke aber ich arbeite leider nich mit MFC. Trotzdem [auch an alle) danke schonmal 😉



  • mal nen stück aus meinem Quellcode:

    message.m_uiLength	= (unsigned int)strlen(lpszUsername) + strlen(lpszPassword) + 3;
    	message.alloc();
    
    	LPSTR lpData = (LPSTR)message.m_pData;
    
    	strncpy(lpData, lpszUsername, strlen(lpszUsername));
    	strncpy(&lpData[strlen(lpszUsername)+1], lpszPassword, strlen(lpszPassword));
    

    ... die sind dann auch mit nem \0 von einander getrennt 😃



  • @(D)Evil:

    Sry aber ich versteh nicht ganz was du meinst 😕 🙄



  • arg... dann lass es... such einfach immer die stringabschnitte(also von # bis 😵 ... und die setzt du dann wie oben beschrieben wieder zusammen...



  • MASTER_OF_NULL schrieb:

    aber das /\ hab ich mit nem '#'-Zeichen bereits probiert...das hat nicht funktioniert

    Was für ein Ergebnis ist da genau rausgekommen?



  • Naja das Ergebnis war, das der Dlg zwar angezeigt wurde, aber der Filter sah etwas 'misshandelt' aus 😃

    Filter schrieb:

    Fgf/

    oder sowas... 🤡



  • MASTER_OF_NULL schrieb:

    unsigned long ulCount;
    	for(ulCount = 0L; ulCount <= strlen(pszReSrcStr); ulCount++)
    	{
    		if(pszReSrcStr[ulCount] == '#')
    		pszReSrcStr[ulCount] = '\0';
    	}
    

    Du solltest besser sowas rausmachen:

    unsigned long ulCount, ulMax;
             ulMax=strlen(pszReSrcStr);
    	for(ulCount = 0L; ulCount <= ulMax; ulCount++)
    	{
    		if(pszReSrcStr[ulCount] == '#')
    		pszReSrcStr[ulCount] = '\0';
    	}
    

    strlen() macht nichts anderes als nach dem '\0' suchen 😉
    Wenn du z.B. "hallo#blupp#bla" hättest, würde er in der schleife auf das erste "#" treffen und dein string sähe so aus: "hallo\0blupp#bla", was nichts anderes bedeutet als dass dein string nur noch aus "hallo" besteht 😉
    Für nahezu sämtliche WinAPI-Funktionen endet ein String ab dem '\0' 😉



  • Jop, da hast wohl recht :p ...aber vorige Version arbeitete mit std::string-Objekte, da funzt es auch nicht 😞



  • machs so wie ichs gesagt hab... das ist ohne std::string 🙂


Anmelden zum Antworten