Probleme mit Parameterübergabe



  • Hi,
    ich hoffe, mit meiner Frage, diesmal im richtigen Forum zu sein!
    Nach umfangreicher Suche und Fragerei habe ich folgendes ungelöstes Problem:

    extern "C" __declspec( dllexport ) int QtTestINI_write(char bla[255])
    {
    int r;
    r = WritePrivateProfileString((bla, TEXT("EinPfad"), TEXT("huhu"), TEXT("c:\\test.ini"));
    return(r);
    }
    Es geht hier nicht um WritePrivateProfileString sondern um die Parameterübergabe für den Parameter bla!
    Der Übergabetyp,in meiner Funktion, steht nicht fest habs nur mit char bla[255] probiert.
    WritePrivateProfileString erwartet ein wchar. Wie kann ich meinen Übergabeparameter so konvertieren, dass das passt.

    Grüsse
    Rainer



  • Die Funktion mbstowcs http://www.cplusplus.com/reference/clibrary/cstdlib/mbstowcs/ könnte dir helfen.


  • Mod



  • r2009 schrieb:

    Hi,
    ich hoffe, mit meiner Frage, diesmal im richtigen Forum zu sein!

    Du hast Probleme mit der Programmierung der WinAPI, da ist das WinAPI-Forum definitiv der bessere Ort für.



  • nee loks,
    diese Diskussion hatten wir schon. Hier gehts um einen puren Typecast sonst nichts.
    Das hat absolut nichts mit winapi zu tun sondern nur mit C oder C++

    Grüsse
    Rainer



  • r2009 schrieb:

    nee loks,
    diese Diskussion hatten wir schon. Hier gehts um einen puren Typecast sonst nichts.

    Und char und wchar sind nunmal 2 Paar Schuhe, du kannst nicht Äpfel in Birnen durch hartes konvertieren des Zeigers erreichen. Deine Problematiken liegen aber in 2 Dingen:

    r2009 schrieb:

    Das hat absolut nichts mit winapi zu tun sondern nur mit C oder C++

    1. Dir fehlt ein gewisses Basisverständnis zu Konvertierungen und Datentypen.
    2. Die WindowsAPI hat sehr wohl damit zu tun. Ob die Unicode- oder ANSI-Variante des Makros "WritePrivateProfileString" (Den es ist keine Funktion sondern ein Makro das zwischen 2 Funktionen auswählt) gewählt wird, hängt auch von deinen Projekteinstellungen etc. ab. Und du solltest dich grundsätzlich mit der WinAPI beschäftigen um dies zu verstehen.

    Deine Frage gehört jedenfalls deutlich eher in das WinAPI, als in das ANSI C++ Forum.



  • OK Leute,
    mir reicht das jetzt. Dieses Forum ist nichts für mich.

    Ich habe von vorneherein gesagt, dass ich professioneller Delphi Entwickler bin und noch nie etwas mit C++ zu tun hatte.

    Anstatt sich auf Lösungen zu konzentrieren wird hier nur rumlamtiert wo was hin soll. Ausser persönliche Angriffe und sehr nahe an Beleidigungen gehende Bemerkungen hab ich hier nichts konstruktives gesehen.

    Grüsse und Tschüss
    Rainer



  • r2009 schrieb:

    professioneller Entwickler

    rofl, dann benimm Dich wien Profi und hör zu wenn Leute, die deutlich mehr Ahnung von der Materie haben Dir helfen wollen.

    r2009 schrieb:

    nichts konstruktives gesehen.

    Erster Antwort-Post link auf die Lösung
    Zweiter Antwort-Post link auf eine alternative Lösung

    loks schrieb:

    r2009 schrieb:

    Hi,
    ich hoffe, mit meiner Frage, diesmal im richtigen Forum zu sein!

    Du hast Probleme mit der Programmierung der WinAPI, da ist das WinAPI-Forum definitiv der bessere Ort für.

    DU hast gefragt, ich habe darauf geantwortet. Was bitte ist daran unkonstruktiv oder beleidigend?



  • Hi,

    ich habe eine Lösung (mit QT4 geschrieben):
    Die Kollegen der Delphi-Praxis haben mir ganz schnell und unkonventionell geholfen.
    Damit nicht nocheinmal jemand auf diese Typecastsch.. reinfällt hier ein Stück Code aus der man ersehen kann wie das Problem gelöst werden kann.
    wtoc und wtoci habe ich selbst geschrieben (nach einer Vorlage aus dem Internet).
    Das Teil soll eine DLL und aus Delphi heraus benutzt werden.
    Achtung: diese Funktionen sind so modifiziert, dass Pascal-Strings übergeben werden können.
    Pascal Strings speichern ihre Länge im ersten Byte, danach folgt der eigentliche String.
    Sicher gibt es hier den einen oder anderen der das besser kann.
    Würde mich freuen wenn das jemand optimieren könnte. Ich bin gerne bereit den Delphi Code zur Verfügung zu stellen.

    struct MyStruct
    {
      char TestA[101];
      char TestB[101];
      char TestC[101];
      char TestD[101];
      int NumA;
      int NumB;
      int NumC;
    char const* str;
    
    void wtoc(char* Dest, TCHAR* Source, int SourceSize) 
    { 
        for(int i = 0; i < SourceSize; ++i) 
        Dest[i+1] = (char)Source[i]; 
        Dest[0]  = char(SourceSize); 
    } 
    
    void wtoci(TCHAR* Dest,char* Source,  int SourceSize) 
    { 
        for(int i = 0; i < SourceSize; ++i) 
        Dest[i] = (char)Source[i+1]; 
    } 
    
    extern "C" __declspec( dllexport ) int QtTestINI_read(struct MyStruct *strct) 
    { 
        int r; 
        TCHAR Test[255]; 
        TCHAR Sektion[101]; 
        TCHAR Steuerwort[101]; 
        TCHAR Pfad[101]; 
        INT destSize=100; 
        wtoci(Sektion,strct->TestA,sizeof(strct->TestA)); 
        wtoci(Steuerwort,strct->TestB,sizeof(strct->TestB)); 
        wtoci(Pfad,strct->TestD,sizeof(strct->TestD)); 
    
        r = GetPrivateProfileString(Sektion,Steuerwort,TEXT("HUHU"),Test,destSize,Pfad); 
        wtoc(strct->TestA,Test,sizeof(Test)); 
        return(r); 
    } 
    
    extern "C" __declspec( dllexport ) int QtTestINI_write(struct MyStruct *strct) 
    { 
        int r; 
        TCHAR Inhalt[101]; 
        TCHAR Sektion[101]; 
        TCHAR Steuerwort[101]; 
        TCHAR Pfad[101]; 
    
        wtoci(Inhalt,strct->TestC,sizeof(strct->TestC)); 
        wtoci(Sektion,strct->TestA,sizeof(strct->TestA)); 
        wtoci(Steuerwort,strct->TestB,sizeof(strct->TestB)); 
        wtoci(Pfad,strct->TestD,sizeof(strct->TestD)); 
        r = WritePrivateProfileString(Sektion, Steuerwort, Inhalt, Pfad); 
        return(r); 
    }
    

    Rainer


Anmelden zum Antworten