Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C++: Parameterübergabe an WritePrivateProfileString (https://www.delphipraxis.net/144812-c-parameteruebergabe-writeprivateprofilestring.html)

R2009 17. Dez 2009 05:35


C++: Parameterübergabe an WritePrivateProfileString
 
Hi alle,
könnte mir jemand erklären wie ich eine Variablenübergabe hinbekomme:

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);
}

bla soll übergeben werden. Der Compiler meckert aber dass er den Datentyp nicht konvertieren kann.


Grüsse
rainer

DeddyH 17. Dez 2009 08:16

Re: C++: Parameterübergabe an WritePrivateProfileString
 
Ich kenne mich mit C/C++ nicht aus, aber klappt es, wenn Du den String mit strcpy o.Ä. in ein kompatibles Array of char kopierst?

R2009 17. Dez 2009 08:56

Re: C++: Parameterübergabe an WritePrivateProfileString
 
Hi,
ich habe eine Lösung gefunden!

Delphi-Quellcode:
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 ) void QtTestDll_ShowDlg()
{
   //ShowDlg();
}

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);
}
Für die Umwandlungen der Typen habe ich zwei eigene Funktionen, wtoc, wtoci geschrieben und diese an die Delphi Verhältnisse angepasst. In Delphi ist ein String immer eines länger ist als man annimmt (String[100] wird zu char test[101]).
Ausserdem steht, in Delphi, an erster Stelle die Länge.
Sollte jemand interesse daran haben bin ich gerne bereit mein Testtool und die DLLs zu veröffentlichen.
Zurzeit läuft die Übergabe in beide Richtungen über ein struct.
Als nächsten Schritt werde ich die Übergabe mit Pchar durchführen.

Mein Facit:
C++ ist eine Sch...sprache.

Ich habe den Code korrigiert (siehe folgenden post).

Vielen Dank an alle die mir geholfen haben (nicht nur in diesem Thread)!
Grüsse
Rainer

R2009 17. Dez 2009 09:29

Re: C++: Parameterübergabe an WritePrivateProfileString
 
Hi,
ich musste wtoc nocheinmal anpassen:

Delphi-Quellcode:
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));
}
Grüsse
Rainer

Daniel 17. Dez 2009 09:37

Re: C++: Parameterübergabe an WritePrivateProfileString
 
...dann editiere doch bitte Deinen vorherigen Beitrag, dann haben wir nur noch eine in sich korrekte Lösung und nicht x Nachträge.

R2009 17. Dez 2009 10:12

Re: C++: Parameterübergabe an WritePrivateProfileString
 
OK Daniel,
ist aber auch blöd von mir! habs im Original korrigiert.

Grüsse
Rainer


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz