Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [C++] casting da char * a PWSTR *

    Salve,

    ho un problema con questo codice:

    http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx
    codice:
    #include <iostream>
    #include <string>
    #include <cstdlib>
    #include <shlobj.h>
    
    int main()
    {
    	LPSTR fullpath;
    	HRESULT res = SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, 0, fullpath);
    }
    ma ottengo questo:

    'SHGetKnownFolderPath' : cannot convert parameter 4 from 'char *' to 'PWSTR *'
    come devo fare il casting?

    grazie
    Alla batteria dai retta ballA

  2. #2
    Devi usare o LPWSTR o PWSTR (meglio la seconda, dato che il parametro è così specificato nella documentazione), poiché la funzione è solo Unicode. In ogni caso, se anche la funzione fosse stata disponibile sia in ANSI che in Unicode, avresti dovuto usare LPCSTR per poter compilare correttamente sia in ANSI che in Unicode.
    Per inciso, se vuoi essere compatibile con sistemi operativi antecedenti a Vitsa usa la SHGetFolderPath (che tra l'altro è disponibile sia in ANSI che in Unicode).
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    ma quella funzione è deprecated comeleggo dal sito...
    Alla batteria dai retta ballA

  4. #4
    Originariamente inviato da MItaly
    Devi usare o LPWSTR o PWSTR (meglio la seconda, dato che il parametro è così specificato nella documentazione), poiché la funzione è solo Unicode. In ogni caso, se anche la funzione fosse stata disponibile sia in ANSI che in Unicode, avresti dovuto usare LPCSTR per poter compilare correttamente sia in ANSI che in Unicode.
    come posso forzare un casting per portarla da PWSTR a semplice char * ??

    grazie
    Alla batteria dai retta ballA

  5. #5
    Originariamente inviato da gianvituzzi
    ma quella funzione è deprecated comeleggo dal sito...
    È deprecated perché è stata introdotta quella nuova, ma fatto sta che quella nuova è supportata solo da Vista in su, per cui se vuoi supportare ancora XP (tuttora diffusissimo) non hai alternative.
    come posso forzare un casting per portarla da PWSTR a semplice char * ??
    Non puoi forzare un bel niente, una PWSTR è di fatto un wchar_t *, ossia una stringa Unicode che non puoi trasformare in ANSI con un semplice cast; per cui:
    • o usi Unicode in tutta la tua applicazione (opzione consigliata, sono stufo di vedere in giro applicazioni Windows che ancora usano i char * e si incasinano se un percorso contiene caratteri stranieri);
    • o usi i generic text mappings, avendo cura di impostare nelle proprietà del progetto Unicode come codifica predefinita (opzione di fatto equivalente alla precedente ma da me preferita per una serie di altri motivi);
    • oppure converti (non è un cast, è proprio una conversione carattere per carattere) la stringa Unicode in ANSI utilizzando o l'apposita funzione della CRT (wcstombs), o l'equivalente API di Windows (WideCharToMultiByte). Tuttavia ti sconsiglio fortemente di usare questo approccio, specialmente con i percorsi di file, visto che non tutti i caratteri Unicode possono essere convertiti in ANSI, per cui ti potresti ritrovare con un percorso pieno di punti di domanda al posto dei caratteri non convertibili.

    Qui una spiegazione un po' più approfondita della questione ANSI/Unicode.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da MItaly
    • o usi Unicode in tutta la tua applicazione (opzione consigliata, sono stufo di vedere in giro applicazioni Windows che ancora usano i char * e si incasinano se un percorso contiene caratteri stranieri);
    *Standing ovation*
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  7. #7
    ok, quindi il codice corretto è questo:

    Codice PHP:
    #include <iostream>
    #include <string>
    #include <cstdlib>
    #include <shlobj.h>

    int main()
    {
        
    TCHAR szPath[MAX_PATH] = {0};

        
    HRESULT res SHGetFolderPath(NULL,
                                      
    CSIDL_LOCAL_APPDATA|CSIDL_FLAG_DONT_VERIFY,
                                      
    NULL,
                                      
    0,
                                      
    szPath);

        
    std::cout << szPath << std::endl;

        

        
    system("pause");
        return 
    EXIT_SUCCESS;

    solo una cosa, se volessi poi aggiungere il nome di un file o cmq un percorso aggiuntivo c'è una funzione speciale che magari si occupa di tradurre le varie slash e gli spazi nel nome oppure devo fare tutto a mano?

    grazie
    Alla batteria dai retta ballA

  8. #8
    Originariamente inviato da shodan
    *Standing ovation*

    Originariamente inviato da gianvituzzi
    ok, quindi il codice corretto è questo:
    ... quasi... se usi i generic text mappings devi includere tchar.h, specificare _tmain al posto di main e usare, a seconda delle impostazioni di carattere, cout o wcout (operazione che puoi semplificare con una macro).
    codice:
    #include <iostream>
    #include <string>
    #include <cstdlib>
    #include <TCHAR.h>
    #include <shlobj.h>
    
    #ifdef _UNICODE
    #define tcout wcout
    #define tcin wcin
    #else
    #define tcout cout
    #define tcin cin
    #endif
    
    int _tmain()
    {
    	TCHAR szPath[MAX_PATH] = {0};
    
    	HRESULT res = SHGetFolderPath(NULL,
    								  CSIDL_LOCAL_APPDATA|CSIDL_FLAG_DONT_VERIFY,
    								  NULL,
    								  0,
    								  szPath);
    
    	std::tcout << szPath << std::endl;
    
    	std::cout<<_T("Premere Invio per continuare... ");
            std::tcin.sync();
            std::tcin.ignore();
    	return EXIT_SUCCESS;
    }
    D'altra parte se intendi compilare solo per Unicode puoi invece usare direttamente i wchar_t, wcout e wcin.
    solo una cosa, se volessi poi aggiungere il nome di un file o cmq un percorso aggiuntivo c'è una funzione speciale che magari si occupa di tradurre le varie slash e gli spazi nel nome oppure devo fare tutto a mano?
    PathAppend; dai un'occhiata anche alle altre Shell Lightweight API, spesso sono di grande comodità.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    solo una cosa, con questo codice ho un errore:

    Codice PHP:
    #include <iostream>
    #include <cstdlib>
    #include <tchar.h>
    #include <shlobj.h>
    #include <shlwapi.h>

    int _tmain()
    {
        
    TCHAR szPath[MAX_PATH] = {0};

        
    HRESULT res SHGetFolderPath(NULL,
                                      
    CSIDL_LOCAL_APPDATA|CSIDL_FLAG_DONT_VERIFY,
                                      
    NULL,
                                      
    0,
                                      
    szPath);

        
    std::cout << szPath << std::endl;

        
    PathAppend(szPathTEXT("myfile.txt"));

        
    std::cout << szPath << std::endl;

        
    system("pause");
        return 
    EXIT_SUCCESS;

    main.obj : error LNK2019: unresolved external symbol __imp__PathAppendA@8 referenced in function _main

    mah...
    Alla batteria dai retta ballA

  10. #10
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Hai aggiunto al progetto il file: shlwapi.lib ?
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.