[Gelöst] Brauche Hilfe bei einer C++ Funktion

  • Ich versuche eine AU3-Funktion in C++ Nachzuschreiben, nur kriege ich das so gar nich hin.... Mir fehlt einfach der C++ Skill dazu ?(
    Nun ja, diese Funktion ist für mein Projekt: SciTEexecuter, und die AU3 Variante benötigt (auf meinem Schrotti) glatte 29 Minuten!! Und diese will ich mit der Cpp-UDF jetzt eben in C++ nachbauen und mal schauen wieviel Performance-Plus es gegenüber normalen AU3 gibt.

    Au3-Code
    [autoit]


    ; Das Erweiterte Syntax-Highlighting erstellen
    Else
    $keywordclass_functions = StringTrimRight($keywordclass_functions, 2)
    $keywordclass_functions &= " \ " & @CRLF & _
    chr(9) & " cppapi: \" & @CRLF & chr(9) & " "
    $keywordclass_defines &= " \ " & @CRLF & _
    chr(9) & " cppapi: \" & @CRLF & chr(9) & " "
    $JustUnknown_functions &= "" & _
    chr(9) & " cppapiunknown: \" & @CRLF & chr(9) & " "
    _FileReadToArray($FileCppApi, $AllIncludeFiles)
    GUICtrlSetData($Progress1, 0)

    [/autoit] [autoit][/autoit] [autoit]

    While $i <= $AllIncludeFiles[0] ; Eine Funktion aus der Liste laden
    $tempA = StringLeft($AllIncludeFiles[$i],3)
    $temp = StringTrimLeft($tempA, 2)
    $tempA = StringLeft($AllIncludeFiles[$i],2)
    $tempA = StringTrimLeft($tempA, 1)
    $tempB = StringLeft($AllIncludeFiles[$i],1)
    If StringInStr($AllIncludeFiles[$i], "(") then
    ; Eine Funktion gefunden
    $temp = StringSplit($AllIncludeFiles[$i], "(", 1)
    $AllIncludeFiles[$i] = $temp[1]
    If not StringInStr($IncludeLine, " " & $AllIncludeFiles[$i] & " ") and not StringInStr($keywordclass_defines, " " & $AllIncludeFiles[$i] & " ") and not StringInStr($keywordclass_keywords, " " & $AllIncludeFiles[$i] & " ") and not StringInStr($keywordclass_functions, " " & $AllIncludeFiles[$i] & " ") then
    $IncludeLine &= $AllIncludeFiles[$i] & " "
    if StringLen($IncludeLine) > 600 Then ; Zeile verkürzen
    $IncludeLine &= "\ " & @CRLF
    $keywordclass_functions &= $IncludeLine
    dim $IncludeLine = chr(9) & " "
    EndIf
    EndIf
    ElseIf StringIsUpper($AllIncludeFiles[$i]) Or StringIsUpper($temp) Or ($temp = "_" and StringIsUpper($tempA) and StringIsUpper($tempB)) then
    ; Eine Define gefunden
    If not StringInStr($DefineLine, " " & $AllIncludeFiles[$i] & " ") and not StringInStr($keywordclass_defines, " " & $AllIncludeFiles[$i] & " ") and not StringInStr($keywordclass_keywords, " " & $AllIncludeFiles[$i] & " ") and not StringInStr($keywordclass_functions, " " & $AllIncludeFiles[$i] & " ") then
    $DefineLine &= $AllIncludeFiles[$i] & " "
    if StringLen($DefineLine) > 600 Then ; Zeile verkürzen
    $DefineLine &= "\ " & @CRLF
    $keywordclass_defines &= $DefineLine
    dim $DefineLine = chr(9) & " "
    EndIf
    EndIf
    Else
    ; Eine weitere Funktion gefunden
    If not StringInStr($DefineLine, " " & $AllIncludeFiles[$i] & " ") and not StringInStr($IncludeLine, " " & $AllIncludeFiles[$i] & " ") and not StringInStr($keywordclass_defines, " " & $AllIncludeFiles[$i] & " ") and not StringInStr($keywordclass_keywords, " " & $AllIncludeFiles[$i] & " ") and not StringInStr($keywordclass_functions, " " & $AllIncludeFiles[$i] & " ") then
    $JustUnknownLine &= $AllIncludeFiles[$i] & " "
    if StringLen($JustUnknownLine) > 600 Then ; Zeile verkürzen
    $JustUnknownLine &= "\ " & @CRLF
    $JustUnknown_functions &= $JustUnknownLine
    dim $JustUnknownLine = chr(9) & " "
    EndIf
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($Progress1, (100/$AllIncludeFiles[0])*$i)
    GUICtrlSetData($StatusLabel, $AllIncludeFiles[$i])
    $i+=1
    WEnd

    [/autoit]
    Meine jetzige C++ Funktion
    [autoit]


    #include <stdio.h>
    #include <windows.h>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    //~ AutoIt Variablen-Übergabe
    char Keywordclass_Keywords[] = "keywordclass.keywords= standart: and and_eq asm auto bitand bitor bool break byte callback case casting_comparison catch cdecl char class continue const const_cast default define delete dword dwordlong do double dynamic_cast And And_Eq Asm Auto Bitand Bitor Bool Break Byte Callback Case Casting_Comparison Catch Cdecl Char Class Continue Const Const_Cast Default Define Delete Dword DwordLong Do Double Dynamic_Cast AND AND_EQ ASM AUTO BITAND BITOR BOOL BREAK BYTE";
    char Keywordclass_Functions[] = "keywordclass.functions= standart: asctime clock ctime datime difftime gmtime localtime mktime setlocale start strftime time clearerr fclose feof ferror fflush fgetc fgetpos fgets fopen fprintf fpurge fputc fputs fread freopen fscanf AscTime Clock CTime DaTime DiffTime cppapi: ";
    char Keywordclass_Defines[] = "keywordclass.defines= standart: HGLRC MSG HDC HWND HWND_DESKTOP WM_SIZE WM_PAINT WM_CREATE WM_DESTROY WM_CLOSE WM_QUIT WM_TIMER WM_COMMAND CLIENTCREATESTRUCT WPARAM LPARAM WPARAM GPTR HINSTANCE WNDCLASSEX WM_CREATE IDI_APPLICATION IDC_ARROW MB_ICONEXCLAMATION MB_OK WS_EX_APPWINDOW WS_OVERLAPPEDWINDOW WS_CLIPCHILDREN CW_USEDEFAULT CW_USEDEFAULT CW_USEDEFAULT CW_USEDEFAULT HMENU WS_CHILD WS_VISIBLE BS_PUSHBUTTON WS_EX_CLIENTEDGE cppapi: ";
    char JustUnknown_Functions[] = "cppapiunknown: ";
    char FileCppApi[] = "C:/Program Files/AutoIt3/SciTE/api/cpp.api"; // Muß im Unix-Style angegeben werden!

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    //~ Load "cpp.api" File
    CHAR* LoadFile(LPSTR pszFileName)
    {
    HANDLE hFile;
    hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
    if(hFile != INVALID_HANDLE_VALUE)
    {
    DWORD dwFileSize = GetFileSize(hFile, NULL);
    LPSTR pszFileText = (LPSTR)GlobalAlloc(GPTR, dwFileSize + 1);
    DWORD dwRead;
    ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL);
    return pszFileText;
    }
    else
    {
    return 0;
    }
    }

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    //~ Hauptprogramm
    int main()
    {
    char* AllIncludeFiles = LoadFile(FileCppApi);
    //~ Die AllIncludeFiles ist eigentlich ein Array welches den Inhalt der 'cpp.api' enthält
    //~ und dieses Array wird ausgelesen und Stück für Stück mit den Keywords-Einträgen verglichen:
    //~ Keywordclass_Keywords, Keywordclass_Functions, Keywordclass_Defines, JustUnknown_Functions
    //~ Ist der Eintrag aus dem Array NICHT in den Keywords vorhanden, soll es nach Regeln sortiert und angehängt werden:
    //~ Wenn alles Großgeschrieben ist ist es eine 'Keywordclass_Defines' (Auch wenn es Groß ist und '_' enthält)
    //~ Wenn ein Eintrag eine '(' enthält ist es eine 'Keywordclass_Functions'
    //~ Sollten die ersten beiden Regeln nicht greifen ist es eine 'JustUnknown_Functions'
    //~ Anschliessend werden die Werte mit den StdOut Stream zurückgegeben:
    printf("%s", AllIncludeFiles);
    }

    [/autoit]


    Ich habe einen Teil der Funktion aus dem SciTEexecuter zur !Einsicht beigefügt, sie Funktioniert so nicht; ist aber zur veranschauung wie es bisher Funktionierte.
    So richtig weit bin ich mit dem C++ nicht gekommen, hab´s grad mal geschafft die 'cpp.api' in ein komisches Array-Format zu laden. Nur jetzt beginnt das Sortieren der Array-Einträgen, und das krieg ich gar net hin :pinch:
    Ich habe bereits fast 3 Tage für die C++ Funktion gebraucht, wegen mangelnder Helpfiles und schlechten Tut´s; und binn schon kurz davor die Sache in den Wind zu schiessen...

    Cpp-UDF Funktion
    [autoit]


    ; Das Erweiterte Syntax-Highlighting erstellen
    $keywordclass_functions = StringTrimRight($keywordclass_functions, 2)
    $keywordclass_functions &= " \ " & @CRLF & _
    chr(9) & " cppapi: \" & @CRLF & chr(9) & " "
    $keywordclass_defines &= " \ " & @CRLF & _
    chr(9) & " cppapi: \" & @CRLF & chr(9) & " "
    $JustUnknown_functions &= "" & _
    chr(9) & " cppapiunknown: \" & @CRLF & chr(9) & " "

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Start der C++ Funktion
    $TimerCpp = TimerInit()
    ; Die AU3 Variablen in ein besseres Format bringen
    Local $TempKeywordclass_keywords
    $TempKeywordclass_keywords = StringReplace($keywordclass_keywords, "\" & @CRLF, "")
    $TempKeywordclass_keywords = StringReplace($TempKeywordclass_keywords, chr(9) & " ", "")
    $TempKeywordclass_keywords = StringReplace($TempKeywordclass_keywords, " \ " & @CRLF, "")
    $TempKeywordclass_keywords = StringReplace($TempKeywordclass_keywords, @CRLF, "")
    Local $TempKeywordclass_functions
    $TempKeywordclass_functions = StringReplace($keywordclass_functions, "\" & @CRLF, "")
    $TempKeywordclass_functions = StringReplace($TempKeywordclass_functions, chr(9) & " ", "")
    $TempKeywordclass_functions = StringReplace($TempKeywordclass_functions, " \ " & @CRLF, "")
    $TempKeywordclass_functions = StringReplace($TempKeywordclass_functions, @CRLF, "")
    Local $TempKeywordclass_defines
    $TempKeywordclass_defines = StringReplace($keywordclass_defines, "\" & @CRLF, "")
    $TempKeywordclass_defines = StringReplace($TempKeywordclass_defines, chr(9) & " ", "")
    $TempKeywordclass_defines = StringReplace($TempKeywordclass_defines, " \ " & @CRLF, "")
    $TempKeywordclass_defines = StringReplace($TempKeywordclass_defines, @CRLF, "")
    Local $TempJustUnknown_functions
    $TempJustUnknown_functions = StringReplace($JustUnknown_functions, "\" & @CRLF, "")
    $TempJustUnknown_functions = StringReplace($TempJustUnknown_functions, chr(9) & " ", "")
    $TempJustUnknown_functions = StringReplace($TempJustUnknown_functions, " \ " & @CRLF, "")
    $TempJustUnknown_functions = StringReplace($TempJustUnknown_functions, @CRLF, "")
    Local $TempFileCppApi
    $TempFileCppApi = StringReplace($FileCppApi, "\", "/") ; Den Path im UNIX-style übergeben

    [/autoit] [autoit][/autoit] [autoit]

    Local $Cpp = CppInit("cpp") ; Das C++ 'Objekt' erstellen
    CppAdd($Cpp, '' & _ ; Programmcode hinzufügen
    '#include <stdio.h>' & @CRLF & _
    '#include <windows.h>' & @CRLF & _
    '' & @CRLF & _
    '' & @CRLF & _
    '//~ AutoIt Variablen-Übergabe' & @CRLF & _
    'char Keywordclass_Keywords[] = "' & $TempKeywordclass_keywords & '";' & @CRLF & _ ; Eine AutoIt Variable übergeben
    'char Keywordclass_Functions[] = "' & $TempKeywordclass_functions & '";' & @CRLF & _; Eine AutoIt Variable übergeben
    'char Keywordclass_Defines[] = "' & $TempKeywordclass_defines & '";' & @CRLF & _ ; Eine AutoIt Variable übergeben
    'char JustUnknown_Functions[] = "' & $TempJustUnknown_functions & '";' & @CRLF & _ ; Eine AutoIt Variable übergeben
    'char FileCppApi[] = "' & $TempFileCppApi & '";' & @CRLF & _ ; Eine AutoIt Variable übergeben
    '' & @CRLF & _
    '' & @CRLF & _
    '//~ Load "cpp.api" File' & @CRLF & _ ; abgeänderte '_FileReadToArray($FileCppApi, $AllIncludeFiles)' Funktion
    'CHAR* LoadFile(LPSTR pszFileName)' & @CRLF & _
    '{' & @CRLF & _
    ' HANDLE hFile;' & @CRLF & _
    ' hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);' & @CRLF & _
    ' if(hFile != INVALID_HANDLE_VALUE)' & @CRLF & _
    ' {' & @CRLF & _
    ' DWORD dwFileSize = GetFileSize(hFile, NULL);' & @CRLF & _
    ' LPSTR pszFileText = (LPSTR)GlobalAlloc(GPTR, dwFileSize + 1);' & @CRLF & _
    ' DWORD dwRead;' & @CRLF & _
    ' ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL);' & @CRLF & _
    ' return pszFileText;' & @CRLF & _
    ' }' & @CRLF & _
    ' else' & @CRLF & _
    ' {' & @CRLF & _
    ' return 0;' & @CRLF & _
    ' }' & @CRLF & _
    '}' & @CRLF & _
    '' & @CRLF & _
    '' & @CRLF & _
    '//~ Hauptprogramm' & @CRLF & _ ; Hauptschleife
    'int main()' & @CRLF & _
    '{' & @CRLF & _
    ' char* AllIncludeFiles = LoadFile(FileCppApi);' & @CRLF & _
    ' printf("%s", AllIncludeFiles);' & @CRLF & _
    '}' )

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    CppCompile($Cpp) ; Programmcode Kompilieren
    CppStdOut($Cpp) ; Einen Rückgabewert über den Stdout Stream abfangen

    [/autoit] [autoit][/autoit] [autoit]

    $TimerCpp = TimerDiff($TimerCpp) / 1000
    Local $return = CppExecute($Cpp) ; Programmcode ausführen und den Rückgabewert auffangen - stdout char
    MsgBox(262144,'Debug line ~' & @ScriptLineNumber,"Benötigte Zeit : " & $TimerCpp & " Sekunden" & @lf & @lf & 'Selection:' & @lf & '$return' & @lf & @lf & 'Return:' & @lf & $return & @CRLF) ;### Debug MSGBOX
    CppExit($Cpp) ; C++ Objekt wieder freigeben
    Exit

    [/autoit]


    Die 'Cpp-UDF' Funktion ist auch nur zur Veranschauung, und Funzt so nicht (da Fehlt eben der Rest des Programmes). Ich wollt nur mal Zeigen, das ich nicht nur Schlafe! Aber ich Peil nicht so richtig mit dem C++ :S
    Ich hoffe das mir jemand Helfen kann bei meinem Problem :D

    Grüsse von Techmix!

    2 Mal editiert, zuletzt von Techmix (12. August 2010 um 13:47)

  • Also ich definiere mene Frage mal anders :D

    Welche C / C++ Befehle kann ich für folgende AutoIt Befehle verwenden?? ?(


    [autoit]

    _FileReadToArray($FileCppApi, $AllIncludeFiles)

    [/autoit]


    Für diese Funk habe ich im C++ Source die Func: 'CHAR* LoadFile(LPSTR pszFileName)' gebastelt, die Funzt auch gut.
    Nur jetzt habe ich das Problem das diese Func einen String und kein Array zurück gibt.
    Dafür bräucht ich jetzt:

    [autoit]

    $Array = StringSplit($AllIncludeFiles, @CRLF, 1)

    [/autoit]


    Nur wie mache ich das Array welches mir ja die StringSplit zurückgibt?
    char Array[] = "Hallo!"
    fprint("%s", Array[1])
    dann gibt fprint doch 'a' aus??

    Dann brauch ich noch umbedingt:

    [autoit]

    StringInStr($AllIncludeFiles[$i], "(") ; und noch
    StringLen($IncludeLine) ; und auch
    StringIsUpper($AllIncludeFiles[$i]

    [/autoit]


    Ich habe natürlich schon meine dürftigen Helpfiles durchwühlt, und habe an meinem Schrotti im Keller kein INet um mich direkt schlau machen zu können! Und an dem entwickele ich eben...

    Nun ja wenn mir jemand sagen könnte welche Cpp Befehle und welche Includes benötigt werden, währe ich sehr dankbar!
    Den Rest kriege ich dann alleine hin... Denke ich :D

    Grüsse von Techmix!

  • Das ist net so leicht in c++, weil die arrays eine Feste Größe haben müssen wenn ich du währe würde ich mit containern arbeiten die sind besser

  • Ich arbeite bei solchen Sachen grundsetzlich mit vectoren. Sind eigentlich von der Handhabung her ganz einfach.


    (ungetestet)

  • @Sprenger: Genau, aber zuerst sollte man sich überlegen, wie man den String trennen will. Dann kann man sich Gedanken über das Speichern machen.

  • Ich binn´s wieder :D

    Ich habe einige Tage an den Funktionen gebastelt, weil es einfach nicht funktionieren wollte... Jetzt funktioniert das Splitten des 'Array´s' in einzelne Wörter. Und wenn ich einen Suchstring erstelle 'char Search_String[]' und dieser die gesammten Wörter/Befehle enthällt funktioniert es einwandfrei! Nur da ich die gesammten Befehle mit 'char* LoadFile(LPSTR pszFileName)' aus einer Datei auslese, geht´s nimmer ?(
    Ich denke jetzt das es daran liegt das das gesplittete 'LoadFile' einen Pointer zurückgibt...
    Wie kann ich jetzt die gesplitteten Daten aus 'LoadFile' in ein echtes Char bringen??? Tante Google habe ich schon gefragt, wußte aber nicht wonach ich genau suchen muss :D

    Spoiler anzeigen
    [autoit]

    #include <stdio.h>
    #include <string.h>
    #include <windows.h>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    //~ AutoIt Variablen-Übergabe
    char Search_String[] = "__A\ndifftime\nyHeightCharPtsMost\nasctime\nclock\nHDC\nHWND\ngmtime\nlocaltime\n";
    char Keywordclass_Keywords[] = "difftime yHeightCharPtsMost";
    char Keywordclass_Functions[] = "asctime clock";
    char Keywordclass_Defines[] = "HDC HWND";
    char JustUnknown_Functions[] = "gmtime";
    char Keywordclass_Makros[] = "keywordclass.makros= ";
    char FileCppApi[] = "C:/Programme/AutoIt3/SciTE/api/cpp.api";

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    //~ Load File
    char* LoadFile(LPSTR pszFileName)
    {
    HANDLE hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
    if(hFile != INVALID_HANDLE_VALUE)
    {
    DWORD dwFileSize = GetFileSize(hFile, NULL);
    LPSTR pszFileText = (LPSTR)GlobalAlloc(GPTR, dwFileSize + 1);
    DWORD dwRead;
    ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL);
    return pszFileText;
    GlobalFree(pszFileText);
    CloseHandle(hFile);
    }
    else
    {
    return 0;
    }
    }

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    //~ Hauptprogramm
    int main()
    {
    //~ Die 'AllIncludeFiles' ist eigentlich ein Array welches den Inhalt der 'cpp.api' enthält
    //~ und dieses Array wird ausgelesen und Stück für Stück mit den Keywords-Einträgen verglichen:
    //~ Keywordclass_Keywords, Keywordclass_Functions, Keywordclass_Defines, JustUnknown_Functions
    //~ Ist der Eintrag aus dem Array NICHT in den Keywords vorhanden, soll es nach Regeln sortiert und angehängt werden:
    //~ Wenn ein Eintrag '__' am Anfang hat ist ist es ein 'Keywordclass_Macro'
    //~ Wenn alles Großgeschrieben ist ist es eine 'Keywordclass_Defines' (Auch wenn es Groß ist und '_' enthält)
    //~ Wenn ein Eintrag eine '(' enthält ist es eine 'Keywordclass_Functions'
    //~ Sollten die ersten beiden Regeln nicht greifen ist es eine 'JustUnknown_Functions'
    //~ Anschliessend werden die Werte mit dem StdOut Stream zurückgegeben:

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    //~ char* AllIncludeFiles = LoadFile(FileCppApi);
    char* AllIncludeFiles = Search_String;
    char* StringSplitCppApi = strtok (AllIncludeFiles,"\n");
    while (StringSplitCppApi != NULL)
    // Ab hier werden die 'cpp.api' Einträge nach und nach abgearbeitet
    {
    int LenStringSplitCppApi = strlen(StringSplitCppApi);

    [/autoit] [autoit][/autoit] [autoit]

    // Ein Makro?
    if(strncmp("__", StringSplitCppApi, 2) == 0)
    {
    printf ("found Makro: %s\n", StringSplitCppApi);
    }

    [/autoit] [autoit][/autoit] [autoit]

    // Ist es in den 'Keywordclass_Keywords'?
    else if (strstr(Keywordclass_Keywords, StringSplitCppApi) != 0)
    {
    printf("found Keyword: %s \n", StringSplitCppApi);
    }

    [/autoit] [autoit][/autoit] [autoit]

    // Ist es in den 'Keywordclass_Functions'?
    else if(strstr(Keywordclass_Functions, StringSplitCppApi) != 0)
    {
    printf ("found Function: %s\n",StringSplitCppApi);
    }

    [/autoit] [autoit][/autoit] [autoit]

    // Ist es in den 'Keywordclass_Defines'?
    else if(strstr(Keywordclass_Defines, StringSplitCppApi) != 0)
    {
    printf ("found Define: %s\n",StringSplitCppApi);
    }

    [/autoit] [autoit][/autoit] [autoit]

    // Ist es in den 'JustUnknown_Functions'?
    else if(strstr(JustUnknown_Functions, StringSplitCppApi) != 0)
    {
    printf ("found JustUnknownFunction: %s\n",StringSplitCppApi);
    }

    [/autoit] [autoit][/autoit] [autoit]

    else
    {
    printf ("nothing found: %s\n",StringSplitCppApi);
    }

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    StringSplitCppApi = strtok (NULL, "\n");
    }
    }

    [/autoit]

    So wie ich den Code hier eingefügt habe funzt er Prima, nur wenn ich Zeile 51 mit 52 wechsele ('char Search_String[]' / 'char* LoadFile') Funktioniert es nicht mehr bzw. kann er die Einträge aus der Datei nicht mit den Array´s vergleichen; wieso????

    Ich hoff mal es kann mir jemand helden :rolleyes:

    Grüsse!

  • LoadFile ist schon mal nicht korrekt. Du schließt das Dateihandle nie, da return davor abbricht.

  • Aber wenn ich das 'return' vor dem 'CloseHandle' ausführe, erhalte ich komischerweise keinen Rückgabewert...
    Ist schon Merkwürdig :D

    Danke für die echt schnelle Antwort!

  • So wei bin ich gestern noch gekommen:

    Spoiler anzeigen
    [autoit]

    //~ =======================================================================================================================
    //~
    //~ Die 'char* AllIncludeFiles' ist eigentlich ein Array welches den Inhalt der 'cpp.api' enthält [T]
    //~ Nur liegt das Problem anscheinend in der Funkion: 'LoadFile' bzw. am Rückgabewert dessen *verzweifel* [ ]
    //~ Dieses Array wird ausgelesen und Stück für Stück mit den Keywords-Einträgen verglichen: [T]
    //~ Keywordclass_Keywords, Keywordclass_Functions, Keywordclass_Defines, JustUnknown_Functions [T]
    //~ Ist der Eintrag aus dem Array NICHT in den Keywords vorhanden, soll es nach Regeln sortiert und angehängt werden: [T]
    //~ Wenn ein Eintrag '__' am Anfang hat ist ist es ein 'Keywordclass_Macro' [T]
    //~ Wenn alles Großgeschrieben ist ist es eine 'Keywordclass_Defines' (Auch wenn es Groß ist und '_' enthält) [T]
    //~ Wenn ein Eintrag eine '(' enthält ist es eine 'Keywordclass_Functions' [T]
    //~ Sollten die ersten beiden Regeln nicht greifen ist es eine 'JustUnknown_Functions' [T]
    //~ Anschliessend werden die Werte mit dem StdOut Stream zurückgegeben.
    //~
    //~ [T] steht für Techmix, ist also schon erledigt :D
    //~ [ ] steht für Nix, ist noch in Arbeit
    //~
    //~ =======================================================================================================================

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <ctype.h>
    #include <stdio.h>
    #include <string.h>
    #include <windows.h>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    //~ AutoIt Variablen-Übergabe
    char FileCppApi[] = "C:/Programme/AutoIt3/SciTE/api/cpp.api";
    char Search_String[] = "__A\ndifftime\nyHeightCharPtsMost\nasctime\nclock\nHDC\nblah\nHWND\ngmtime\nlocaltime\n__B\nHallo(char)\nTEST\nTEST2\nTEST_2\n";
    char Keywordclass_Keywords[] = "difftime yHeightCharPtsMost";
    char Keywordclass_Functions[] = "asctime clock";
    char Keywordclass_Defines[] = "HDC HWND";
    char JustUnknown_Functions[] = "gmtime";
    char Keywordclass_Makros[] = "__A";

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    //~ Load File
    CHAR* LoadFile(LPSTR pszFileName){

    [/autoit] [autoit][/autoit] [autoit]

    HANDLE hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
    if(hFile != INVALID_HANDLE_VALUE)
    {
    DWORD dwFileSize = GetFileSize(hFile, NULL);
    LPSTR pszFileText = (LPSTR)GlobalAlloc(GPTR, dwFileSize + 1);
    DWORD dwRead;
    ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL);
    CloseHandle(hFile);
    return pszFileText;
    }
    else
    {
    return 0;
    }
    }

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    //~ Hauptprogramm
    int main(){
    // 'Startausgabe' der Array´s
    printf ("\n!Start!\n");
    printf ("Keywordclass_Keywords: %s\n", Keywordclass_Keywords);
    printf ("Keywordclass_Makros: %s\n", Keywordclass_Makros);
    printf ("Keywordclass_Defines: %s\n", Keywordclass_Defines);
    printf ("Keywordclass_Functions: %s\n", Keywordclass_Functions);
    printf ("JustUnknown_Functions: %s\n\n", JustUnknown_Functions);

    [/autoit] [autoit][/autoit] [autoit]

    char* AllIncludeFiles = Search_String;
    //~ char* AllIncludeFiles = LoadFile(FileCppApi); // Funktioniert so Garnicht!
    char* StringSplitCppApi = strtok (AllIncludeFiles,"\n"); // Funktioniert Tadellos
    while (StringSplitCppApi != NULL)
    {
    // Ab hier werden die 'cpp.api' Einträge nach und nach abgearbeitet
    int LenStringSplitCppApi = strlen(StringSplitCppApi);

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    // Ein neues Makro?
    if(strncmp("__", StringSplitCppApi, 2) == 0 && strstr(Keywordclass_Makros, StringSplitCppApi) == 0)
    {
    printf("found NEW Makro: %s\n", StringSplitCppApi);
    strncat(Keywordclass_Makros, " ", 1);
    strncat(Keywordclass_Makros, StringSplitCppApi, LenStringSplitCppApi);
    }

    [/autoit] [autoit][/autoit] [autoit]

    // Ist es bei den 'Keywordclass_Makros'?
    else if(strstr(Keywordclass_Makros, StringSplitCppApi) == 0)
    {
    // Ist es schon in den 'Keywordclass_Keywords'?
    if(strstr(Keywordclass_Keywords, StringSplitCppApi) == 0)
    {
    // Ist es schon in den 'Keywordclass_Functions'?
    if(strstr(Keywordclass_Functions, StringSplitCppApi) == 0)
    {
    // Ist es schon in den 'Keywordclass_Defines'?
    if(strstr(Keywordclass_Defines, StringSplitCppApi) == 0)
    {
    // Ist es schon in den 'JustUnknown_Functions'?
    if(strstr(JustUnknown_Functions, StringSplitCppApi) == 0)
    {
    // Der Eintrag ist noch nicht vorhanden, ab hier zählen die Regeln!
    // Functions-Regel
    if(strstr(StringSplitCppApi, "(") != 0)
    {
    printf("found NEW Keywordclass_Functions: %s \n", StringSplitCppApi);
    int Split = strcspn(StringSplitCppApi, "(");
    // 'Keywordclass_Functions' Größe anpassen!!
    strncat(Keywordclass_Functions, " ", 1);
    strncat(Keywordclass_Functions, StringSplitCppApi, Split);
    }

    [/autoit] [autoit][/autoit] [autoit]

    // Defines-Regel
    else
    {
    char c;
    int i = 0;
    int j = 0;
    while(StringSplitCppApi[i])
    {
    c = StringSplitCppApi[i];
    if (isupper(c) or isdigit(c) or ispunct(c)) j++;
    i++;
    }
    if(j == LenStringSplitCppApi)
    {
    printf("found NEW Keywordclass_Defines: %s \n", StringSplitCppApi);
    // 'Keywordclass_Defines' Größe anpassen!!
    strncat(Keywordclass_Defines, " ", 1);
    strncat(Keywordclass_Defines, StringSplitCppApi, LenStringSplitCppApi);
    }

    [/autoit] [autoit][/autoit] [autoit]

    // Regeln haben nichts bewirkt,
    // also ist es eine 'JustUnknown_Function'
    else
    {
    printf("found NEW JustUnknown_Functions: %s \n", StringSplitCppApi);
    // JustUnknown_Functions Größe anpassen!!
    strncat(JustUnknown_Functions, " ", 1);
    strncat(JustUnknown_Functions, StringSplitCppApi, LenStringSplitCppApi);
    }
    }
    }
    }
    }
    }
    }

    [/autoit] [autoit][/autoit] [autoit]

    // Nächster Eintrag
    StringSplitCppApi = strtok (NULL, "\n");
    }

    [/autoit] [autoit][/autoit] [autoit]

    // Jetzt gibt es hier noch Probleme, da die char Array´s nicht in der Grösse angepasst wurden!
    printf ("\n!Ende!\n");
    printf ("Keywordclass_Keywords: %s\n", Keywordclass_Keywords); // soll sich nicht ändern...
    printf ("Keywordclass_Makros: %s\n", Keywordclass_Makros);
    printf ("Keywordclass_Defines: %s\n", Keywordclass_Defines);
    printf ("Keywordclass_Functions: %s\n", Keywordclass_Functions);
    printf ("JustUnknown_Functions: %s\n", JustUnknown_Functions);

    [/autoit] [autoit][/autoit] [autoit]

    }

    [/autoit]

    Aber das Problem mit der Datei besteht immer noch, un ich kann iwie keine Array´s Redimmen ?(

  • Sooo ich habs hinbekommen :D ...endlich!
    Die orginale AU3 Funktion benötigt 1783 Sekunden, diese C-Funktion braucht nur 40 Sekunden 8| So einen Performancesprung hatte ich nicht erwatet!

    C-Funktion
    [autoit]

    #include <ctype.h>
    #include <stdio.h>
    #include <string.h>
    #include <windows.h>

    [/autoit] [autoit][/autoit] [autoit]

    const int ArraySize = 768 * 512;
    //~ AutoIt Variablen-Übergabe
    char FileCppApi[] = "C:/Programme/AutoIt3/SciTE/api/cpp.api";
    char Keywordclass_Keywords[ArraySize] = "difftime yHeightCharPtsMost";
    char Keywordclass_Functions[ArraySize] = "asctime clock";
    char Keywordclass_Defines[ArraySize] = "HDC HWND";
    char JustUnknown_Functions[ArraySize] = "gmtime";
    char Keywordclass_Makros[ArraySize] = "__A";

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    //~ Hauptprogramm
    int main(){
    int LenStringSplitCheck;
    char StringSplitCheck[1];
    char StringSplitCppApi[196];
    FILE * pFile;
    pFile = fopen (FileCppApi,"r");
    fscanf (pFile, "%s", StringSplitCppApi);
    while (!feof(pFile))
    {
    // Ab hier werden die 'cpp.api' Einträge nach und nach abgearbeitet
    int LenStringSplitCppApi = strlen(StringSplitCppApi);

    [/autoit] [autoit][/autoit] [autoit]

    // Ein neues Makro?
    if(strncmp("__", StringSplitCppApi, 2) == 0 && strstr(Keywordclass_Makros, StringSplitCppApi) == 0)
    {
    strncat(Keywordclass_Makros, " ", 1);
    strncat(Keywordclass_Makros, StringSplitCppApi, LenStringSplitCppApi);
    }

    [/autoit] [autoit][/autoit] [autoit]

    else
    {
    // Ist es schon in den 'Keywordclass_Keywords'?
    if(strstr(Keywordclass_Keywords, StringSplitCppApi) == 0)
    {
    // Der Eintrag ist noch nicht vorhanden, ab hier zählen die Regeln!
    // Functions-Regel
    if(strstr(StringSplitCppApi, "(") != 0)
    {
    int Split = strcspn(StringSplitCppApi, "(");
    char StringSplitCheck[Split];
    strncat(StringSplitCheck, StringSplitCppApi, Split);
    int LenStringSplitCheck = strlen(StringSplitCheck);
    if(strstr(Keywordclass_Functions, StringSplitCheck) == 0 )
    {
    strncat(Keywordclass_Functions, " ", 1);
    strncat(Keywordclass_Functions, StringSplitCheck, LenStringSplitCheck);
    }
    }

    [/autoit] [autoit][/autoit] [autoit]

    // Defines-Regel
    else
    {
    char c;
    int i = 0;
    int j = 0;
    while(StringSplitCppApi[i])
    {
    c = StringSplitCppApi[i];
    if (isupper(c) or isdigit(c) or ispunct(c)) j++;
    i++;
    }
    if(strstr(Keywordclass_Defines, StringSplitCppApi) == 0 and j == LenStringSplitCppApi)
    {
    strncat(Keywordclass_Defines, " ", 1);
    strncat(Keywordclass_Defines, StringSplitCppApi, LenStringSplitCppApi);
    }

    [/autoit] [autoit][/autoit] [autoit]

    // Regeln haben nichts bewirkt,
    // also ist es eine 'JustUnknown_Function'
    else if(strstr(JustUnknown_Functions, StringSplitCppApi) == 0 and strchr(StringSplitCppApi, ')') == 0 and strchr(StringSplitCppApi, '*') == 0 and strchr(StringSplitCppApi, ',') == 0 and strchr(StringSplitCppApi, '[') == 0)
    {
    strncat(JustUnknown_Functions, " ", 1);
    strncat(JustUnknown_Functions, StringSplitCppApi, LenStringSplitCppApi);
    }
    }
    }
    }
    // Nächster Eintrag
    fscanf (pFile, "%s", StringSplitCppApi);
    }
    fclose (pFile);

    [/autoit] [autoit][/autoit] [autoit]

    vprintf ("%s\n", Keywordclass_Keywords);
    vprintf ("%s\n", Keywordclass_Makros);
    vprintf ("%s\n", Keywordclass_Defines);
    vprintf ("%s\n", Keywordclass_Functions);
    vprintf ("%s\n", JustUnknown_Functions);
    }

    [/autoit]

    Und da ich diese Funktion für meinen 'SciTEexecuter' benötige habe ich sie mit der 'Cpp-UDF' für AutoIt erstellt:

    AutoIt-Cpp-UDF Funktion
    [autoit]

    #include <Array.au3>
    #include <ButtonConstants.au3>
    #include <File.au3>
    #include <FileConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Version=beta
    #AutoIt3Wrapper_UseX64=n
    #AutoIt3Wrapper_Res_Description=SciTE and AutoIt3 C / C++ AddOn
    #AutoIt3Wrapper_Res_Fileversion=0.99.xx0710
    #AutoIt3Wrapper_Res_LegalCopyright=by Techmix
    #AutoIt3Wrapper_Res_Language=1031
    #AutoIt3Wrapper_Res_Field=AutoIt Version|3.3.5.6 (beta)
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    Opt("TrayIconHide", 1)
    #RequireAdmin

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $RubyReg, $RubyEnvironmentDir, $RubyCompilerDir, $RubyLibsDir, $RubyIncludeDir, $RubyHelp1, $RubyHelp2, $FileRubyProperties
    Global $EnvironmentDir, $CodeBlocksReg, $DevCppReg, $Helpfile1, $Helpfile2, $PropertiesFile1, $PropertiesFile2
    Global $LibsDir, $CompilerDir, $IncludeDir, $CxxIncludeDir, $keywordclass_keywords, $keywordclass_functions, $keywordclass_defines
    Global $Progress1, $Progress2, $destination_dir, $dir, $dirButton, $StatusLabel, $OKButton, $DeinstallButton
    Global $CheckDeutsch, $CheckUAC, $CheckSyntax, $CheckRuby
    Global $AU3dir, $AutoITDir, $SciTEDir, $ApiDir, $ExecuterDir, $PropertiesDir
    Global $FileBuild, $FileExecuter, $FileLocaleProperties, $FileSciTEUser, $FileSciTEGlobal
    Global $FileCppProperties, $FileCppKeywordsProperties, $FileCppOthersProperties, $FileCppApi, $FileCppUDF, $FileCppDemo
    Global $message = 'SciTE muss neu gestartet werden damit die Änderungen wirksam werden!' & @CRLF & @CRLF, $CompressedHex

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Setup() ; Regisrty Gedöns und setzen von Variablen
    GUI() ; Die Gui und der 'mainloop'
    #include <Cpp.au3> ; Cpp ermöglichen
    GettingKeywords() ; Erstellt die 'cpp.keywords.properties' mit einer Cpp-UDF Funktion :D

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$message' & @lf & @lf & 'Return:' & @lf & $message) ;### Debug MSGBOX

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func Uninstall()

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Setup()
    ; Clean UP AU3 dir
    $AU3dir = @AutoItExe
    $AU3dir = StringReplace($AU3dir, "\Beta", "")
    ; AutoITDir Ordner Errechnen
    dim $temp = StringSplit($AU3dir, '\', 1), $AutoITDir = ""
    for $i = 1 to UBound($temp)-2
    $AutoITDir &= $temp[$i] & "\"
    Next
    ; Alle Ordner
    $SciTEDir = $AutoITDir & "SciTE\"
    $ApiDir = $SciTEDir & "api\"
    $ExecuterDir = $SciTEDir & "SciTEexecuter\"
    $PropertiesDir = $SciTEDir & "Properties\"
    ; Alle Dateien
    $FileSciTEGlobal = $SciTEDir & "SciTEGlobal.properties"
    $FileSciTEUser = @UserProfileDir & '\' & "SciTEUser.properties"
    $FileBuild = $ExecuterDir & "Build.au3"
    $FileExecuter = $ExecuterDir & "SciTEexecuter.au3"
    $FileLocaleProperties = $SciTEDir & "locale.properties"
    $FileCppProperties = $PropertiesDir & "cpp.properties"
    $FileCppKeywordsProperties = $PropertiesDir & "cpp.keywords.properties"
    $FileCppOthersProperties = $PropertiesDir & "cpp.others.properties"
    $FileCppApi = $ApiDir & "cpp.api"
    $FileCppUDF = $AutoITDir & "Include\Cpp.au3"
    $FileCppDemo = $AutoITDir & "Examples\CppDemo.au3"
    $FileRubyProperties = $PropertiesDir & "ruby.properties"

    [/autoit] [autoit][/autoit] [autoit]

    ; Registry Eintrag des 'Code::Blocks' Environment suchen
    $CodeBlocksReg = RegRead("HKEY_CLASSES_ROOT\CodeBlocks.c\DefaultIcon", "")
    ; Registry Eintrag des 'Dev-Cpp' Environment suchen
    if @OSVersion <> 'WIN_XP' and @OSArch <> 'X86' then
    $DevCppReg = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Dev-C++", "Install_Dir")
    Else
    $DevCppReg = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Dev-C++", "Install_Dir")
    EndIf
    ; Registry Eintrag des 'Ruby' Environment suchen
    $RubyReg = RegRead("HKEY_CLASSES_ROOT\Applications\ruby.exe\shell\open\command", "")

    [/autoit] [autoit][/autoit] [autoit]

    ; Das 'Code::Blocks' Environment setzen
    if $CodeBlocksReg <> "" then
    dim $temp = StringSplit($CodeBlocksReg, '\', 1), $EnvironmentDir = ""
    for $i = 1 to UBound($temp)-2
    $EnvironmentDir &= $temp[$i] & "\"
    Next
    $LibsDir = $EnvironmentDir & "MinGW\lib"
    $IncludeDir = $EnvironmentDir & "MinGW\include"
    $CxxIncludeDir = $EnvironmentDir & "MinGW\lib\gcc\mingw32\4.4.1"
    $CompilerDir = $EnvironmentDir & "MinGW\bin"
    $EnvironmentDir = StringTrimRight($EnvironmentDir, 1)
    ; Das 'Dev-Cpp' Environment setzen
    ElseIf $CodeBlocksReg = "" then
    $EnvironmentDir = $DevCppReg
    $LibsDir = $EnvironmentDir & "\lib"
    $IncludeDir = $EnvironmentDir & "\include"
    $CxxIncludeDir = $EnvironmentDir & "\include\c++\3.4.2"
    $CompilerDir = $EnvironmentDir & "\bin"
    EndIf
    ; Manuelles aussuchen
    if $EnvironmentDir = "" then
    $EnvironmentDir = "C:\"
    $LibsDir = $EnvironmentDir & "lib"
    $IncludeDir = $EnvironmentDir & "include"
    $CxxIncludeDir = $EnvironmentDir & "include"
    $CompilerDir = $EnvironmentDir & "bin"
    EndIf
    ; Cpp Hilfsdatei setzen
    ; Für '*.chm' Hilsdateien:
    $Helpfile1 = "$(CurrentWord)!$(SciteDefaultHome)\SciTEexecuter\cppreferencecom_feb09.chm"
    $Helpfile2 = "4"
    ; Für '*.hlp' Hilsdateien:
    ; $Helpfile1 = "$(CurrentWord)!C:\Programme\Dev-Cpp\Help\devcpp.HLP"
    ; $Helpfile2 = "5"

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func GUI()
    Local $GUIHeight = 155, $pos = 110
    if @OSVersion <> 'WIN_XP' then $GUIHeight += 25
    if $RubyReg <> "" then $GUIHeight += 25
    $Gui = GUICreate("SciTEexecuter V0.99 by Techmix", 350, $GUIHeight)
    $Group = GUICtrlCreateGroup("C++ Environment Dir", 5, 5, 340, 45)
    $dir = GUICtrlCreateInput($EnvironmentDir, 10, 22, 305, 20)
    $dirButton = GUICtrlCreateButton("", 319, 22, 20, 20, $BS_ICON)
    GUICtrlSetImage ($dirButton, "shell32.dll", 5, 0)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $CheckDeutsch = GUICtrlCreateCheckbox(" Deutsche SciTE Sprachdatei", 10, 60, 200, 17)
    GUICtrlSetState($CheckDeutsch, $GUI_CHECKED)
    $CheckSyntax = GUICtrlCreateCheckbox(" C++ Syntax Highlighting erweitern", 10, 85, 200, 17)
    $DeinstallButton = GUICtrlCreateButton("Deinstallation", 260, $GUIHeight - 90, 85, 25)
    $OKButton = GUICtrlCreateButton("O K", 260, $GUIHeight - 60, 85, 25)
    $StatusLabel = GUICtrlCreateLabel("", 15, $GUIHeight - 45, 240, 15)
    $Progress1 = GUICtrlCreateProgress(5, $GUIHeight - 28, 340, 20)

    [/autoit] [autoit][/autoit] [autoit]

    if $RubyReg <> "" then
    $CheckRuby = GUICtrlCreateCheckbox(" RUBY Unterstützung aktivieren", 10, $pos, 200, 17)
    GUICtrlSetState($CheckRuby, $GUI_CHECKED)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    if @OSVersion <> "WIN_XP" then
    if $RubyReg <> "" then $pos += 25
    $CheckUAC = GUICtrlCreateCheckbox(" Windows UAC Deaktivieren", 10, $pos, 200, 17)
    GUICtrlSetState($CheckUAC, $GUI_CHECKED)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    ; Start ==> Main-Loop
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $DeinstallButton
    Uninstall()
    Case $OKButton
    $destination_dir = GUICtrlRead($dir, 1)
    if FileExists($CompilerDir & "\mingw32-make.exe") and FileExists($CompilerDir & "\g++.exe") then ; Sicherheitsabfrage der Kompiler!!
    ExitLoop
    Else
    MsgBox(0, "Fehler!", 'Konnte die Compiler nicht finden.' & @CRLF & "Bitte das richtige C++ Environmet Verzeichnis auswählen!")
    EndIf
    Case $dirButton
    $destination_dir = FileSelectFolder("Bitte das C++ Environmet Verzeichnis auswählen.", "", 1)
    GUICtrlSetData($dir, $destination_dir)
    $EnvironmentDir = $destination_dir
    $IncludeDir = $EnvironmentDir & "\include"
    $CxxIncludeDir = $EnvironmentDir & "\include"
    $CompilerDir = $EnvironmentDir & "\bin"
    $Helpfile1 = ""
    $Helpfile2 = ""
    EndSwitch
    Sleep(10)
    WEnd
    ; Ende ==> Main-Loop
    Return
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func GettingKeywords()

    [/autoit] [autoit][/autoit] [autoit]

    ; Start ==> cpp.keywords.properties
    Dim $keywordclass_keywords = "" & _
    "keywordclass.keywords= \^° standart: \^° and and_eq asm auto bitand bitor bool break byte callback case casting_comparison catch cdecl char class continue const const_cast default define delete dword dwordlong do double dynamic_cast \^° And And_Eq Asm Auto Bitand Bitor Bool Break Byte Callback Case Casting_Comparison Catch Cdecl Char Class Continue Const Const_Cast Default Define Delete Dword DwordLong Do Double Dynamic_Cast \^° AND AND_EQ ASM AUTO BITAND BITOR BOOL BREAK BYTE CALLBACK CASE CASTING_COMPARISON CATCH CDECL CHAR CLASS CONTINUE CONST CONST_CAST DEFAULT DEFINE DELETE DWORD DWORDLONG DO DOUBLE DYNAMIC_CAST \^° else elseif endif endselectendswitch endwith enum explicit export extern false float for friend goto handle hiword if int inline large_integer long loword lresult lpstr lpwstr mutable namespace next \^° Else ElseIf EndIf EndSelectEndSwitch EndWith Enum Explicit Export Extern False Float For Friend Goto Handle HiWord If Int Inline Large_Integer Long LoWord lResult Lpstr Lpwstr Mutable Namespace Next \^° ELSE ELSEIF ENDIF ENDSELECTENDSWITCH ENDWITH ENUM EXPLICIT EXPORT EXTERN FALSE FLOAT FOR FRIEND GOTO HANDLE HIWORD IF INT INLINE LARGE_INTEGER LONG LOWORD LRESULT LPSTR LPWSTR MUTABLE NAMESPACE NEXT \^° null not not_eq none nothrow new or or_eq operator pbyte private protected public redirect register reinterpret_cast return select struct switch short signed sizeof static static_cast struct stdcall \^° Null Not Not_Eq None NoThrow New Or Or_Eq Operator pByte Private Protected Public Redirect Register Reinterpret_Cast Return Select Struct Switch Short Signed SizeOf Static Static_Cast Struct StdCall \^° NULL NOT NOT_EQ NONE NOTHROW NEW OR OR_EQ OPERATOR PBYTE PRIVATE PROTECTED PUBLIC REDIRECT REGISTER REINTERPRET_CAST RETURN SELECT STRUCT SWITCH SHORT SIGNED SIZEOF STATIC STATIC_CAST STRUCT STDCALL \^° switch template this throw true try typedef typeid typename uint ulong ulong_ptr until union unsigned ushort using virtual void volatile with while wend wchar wchar_t word winapi xor xor_eq \^° Switch Template This Throw True Try TypeDef TypeId TypeName uInt uLong uLong_Ptr Until Union Unsigned uShort Using Virtual Void Volatile With While Wend wChar wChar_T Word WinApi Xor Xor_Eq \^° SWITCH TEMPLATE THIS THROW TRUE TRY TYPEDEF TYPEID TYPENAME UINT ULONG ULONG_PTR UNTIL UNION UNSIGNED USHORT USING VIRTUAL VOID VOLATILE WITH WHILE WEND WCHAR WCHAR_T WORD WINAPI XOR XOR_EQ \^° __stdcall __cdecl _redirect__ _nothrow #define #if #ifdef #ifndef #else #elif #endif \^° __Stdcall __Cdecl _Redirect__ _Nothrow #Define #If #Ifdef #Ifndef #Else #Elif #Endif \^° __STDCALL __CDECL _REDIRECT__ _NOTHROW #DEFINE #IF #IFDEF #IFNDEF #ELSE #ELIF #ENDIF^"
    $keywordclass_keywords = StringReplace($keywordclass_keywords, "^", @CRLF)
    $keywordclass_keywords = StringReplace($keywordclass_keywords, "°", chr(9))
    Dim $keywordclass_functions = "" & _
    "keywordclass.functions= \^° standart: \^° asctime clock ctime datime difftime gmtime localtime mktime setlocale start strftime time clearerr fclose feof ferror fflush fgetc fgetpos fgets fopen fprintf fpurge fputc fputs fread freopen fscanf \^° AscTime Clock CTime DaTime DiffTime GmTime LocalTime MkTime SetLocale Start StrfTime Time ClearErr FClose FEof FError FFlush FGetC FGetPos FGetS FOpen FPrintF FPurge FPutC FPutS FRead FReopen FScanf \^° ASCTIME CLOCK CTIME DATIME DIFFTIME GMTIME LOCALTIME MKTIME SETLOCALE START STRFTIME TIME CLEARERR FCLOSE FEOF FERROR FFLUSH FGETC FGETPOS FGETS FOPEN FPRINTF FPURGE FPUTC FPUTS FREAD FREOPEN FSCANF \^° fseek fsetpos ftell getc getchar gets perror printf putc putchar puts remove rename rewind scanf setbuf setvbuf snprintf sprintf sscanf tmpfile tmpnam ungetc vprintf vfprintf vsprintf vscanf vfscanf \^° FSeek FSetPos FTell GetC GetChar GetS PError PrintF PutC PutChar PutS Remove Rename Rewind ScanF SetBuf SetVBuf SnPrintF SprintF SScanF TmpFile TmpNam UnGetC VPrintF VFPrintF VSPrintF VScanF VFScanF \^° FSEEK FSETPOS FTELL GETC GETCHAR GETS PERROR PRINTF PUTC PUTCHAR PUTS REMOVE RENAME REWIND SCANF SETBUF SETVBUF SNPRINTF SPRINTF SSCANF TMPFILE TMPNAM UNGETC VPRINTF VFPRINTF VSPRINTF VSCANF VFSCANF \^° vsscanf abs acos asin atan atan2 ceil cos cosh div exp fabs factorial double num floor fmod fmtchg frexp hexchk labs ldexp ldiv log log10 modf pow sin float sinh sqrt tan tanh value calloc free malloc \^° VSScanF abs acos asin atan atan2 ceil cos cosh div exp fabs factorial double num floor fmod fmtchg frexp hexchk labs ldexp ldiv log log10 modf pow sin float sinh sqrt tan tanh value calloc free malloc \^° VSSCANF ABS ACOS ASIN ATAN ATAN2 CEIL COS COSH DIV EXP FABS FACTORIAL DOUBLE NUM FLOOR FMOD FMTCHG FREXP HEXCHK LABS LDEXP LDIV LOG LOG10 MODF POW SIN FLOAT SINH SQRT TAN TANH VALUE CALLOC FREE MALLOC \^° realloc abort assert atexit bsearch exit getenv longjmp qsort raise rand setjmp signal srand start system va_arg va_start va_end atof atoi atol isalnum isalpha iscntrl isdigit isgraph islower isprint \^° REALLOC ABORT ASSERT ATEXIT BSEARCH EXIT GETENV LONGJMP QSORT RAISE RAND SETJMP SIGNAL SRAND START SYSTEM VA_ARG VA_START VA_END ATOF ATOI ATOL ISALNUM ISALPHA ISCNTRL ISDIGIT ISGRAPH ISLOWER ISPRINT \^° ispunct isspace isupper isxdigit memchr memcmp memcpy memmove memset strcat strchr strcmp strcoll strcpy strcspn strerror strlcat strlcpy strlen strncat strncmp strncpy strpbrk strrchr strspn strstr \^° ISPUNCT ISSPACE ISUPPER ISXDIGIT MEMCHR MEMCMP MEMCPY MEMMOVE MEMSET STRCAT STRCHR STRCMP STRCOLL STRCPY STRCSPN STRERROR STRLCAT STRLCPY STRLEN STRNCAT STRNCMP STRNCPY STRPBRK STRRCHR STRSPN STRSTR \^° strtod strtok strtol strtoul strtrm strxfrm tolower toupper bad clear close eof fail fill flags flush gcount get getline good ignore open peek precision put putback rdstate read seekg seekp setf start \^° STRTOD STRTOK STRTOL STRTOUL STRTRM STRXFRM TOLOWER TOUPPER BAD CLEAR CLOSE EOF FAIL FILL FLAGS FLUSH GCOUNT GET GETLINE GOOD IGNORE OPEN PEEK PRECISION PUT PUTBACK RDSTATE READ SEEKG SEEKP SETF START \^° sync_with_stdio tellg tellp unsetf width write stringstream ostringstream istringstream rdbuf str sleep start usleep accumulate adjacent_difference adjacent_find binary_search copy copy_backward copy_n \^° SYNC_WITH_STDIO TELLG TELLP UNSETF WIDTH WRITE STRINGSTREAM OSTRINGSTREAM ISTRINGSTREAM RDBUF STR SLEEP START USLEEP ACCUMULATE ADJACENT_DIFFERENCE ADJACENT_FIND BINARY_SEARCH COPY COPY_BACKWARD COPY_N \^° count count_if equal equal_range fill fill_n find find_end find_first_of find_if for_each generate generate_n includes inner_product inplace_merge is_heap is_sorted iter_swap lexicographical_compare \^° COUNT COUNT_IF EQUAL EQUAL_RANGE FILL FILL_N FIND FIND_END FIND_FIRST_OF FIND_IF FOR_EACH GENERATE GENERATE_N INCLUDES INNER_PRODUCT INPLACE_MERGE IS_HEAP IS_SORTED ITER_SWAP LEXICOGRAPHICAL_COMPARE \^° lexicographical_compare_3way lower_bound make_heap max max_element merge min min_el" & _
    "ement mismatch next_permutation nth_element partial_sort partial_sort_copy partial_sum partition pop_heap prev_permutation \^° LEXICOGRAPHICAL_COMPARE_3WAY LOWER_BOUND MAKE_HEAP MAX MAX_ELEMENT MERGE MIN MIN_ELEMENT MISMATCH NEXT_PERMUTATION NTH_ELEMENT PARTIAL_SORT PARTIAL_SORT_COPY PARTIAL_SUM PARTITION POP_HEAP PREV_PERMUTATION \^° push_heap random_sample random_sample_n random_shuffle remove remove_copy remove_copy_if remove_if replace replace_copy replace_copy_if replace_if reverse reverse_copy rotate rotate_copy search search_n \^° PUSH_HEAP RANDOM_SAMPLE RANDOM_SAMPLE_N RANDOM_SHUFFLE REMOVE REMOVE_COPY REMOVE_COPY_IF REMOVE_IF REPLACE REPLACE_COPY REPLACE_COPY_IF REPLACE_IF REVERSE REVERSE_COPY ROTATE ROTATE_COPY SEARCH SEARCH_N \^° set_difference set_intersection set_symmetric_difference set_union sort sort_heap stable_partition stable_sort start swap_ranges transform unique unique_copy upper_bound any count flip none reset set \^° SET_DIFFERENCE SET_INTERSECTION SET_SYMMETRIC_DIFFERENCE SET_UNION SORT SORT_HEAP STABLE_PARTITION STABLE_SORT START SWAP_RANGES TRANSFORM UNIQUE UNIQUE_COPY UPPER_BOUND ANY COUNT FLIP NONE RESET SET \^° size test to_string to_ulong assign at back begin clear deque empty end erase front insert max_size pop_back pop_front push_back push_front rbegin rend resize size back begin clear empty end erase front \^° SIZE TEST TO_STRING TO_ULONG ASSIGN AT BACK BEGIN CLEAR DEQUE EMPTY END ERASE FRONT INSERT MAX_SIZE POP_BACK POP_FRONT PUSH_BACK PUSH_FRONT RBEGIN REND RESIZE SIZE BACK BEGIN CLEAR EMPTY END ERASE FRONT \^° insert list max_size merge pop_back pop_front push_back push_front rbegin remove remove_if rend resize reverse size sort splice swap unique begin clear equal_range find key_comp lower_bound rbegin rend \^° INSERT LIST MAX_SIZE MERGE POP_BACK POP_FRONT PUSH_BACK PUSH_FRONT RBEGIN REMOVE REMOVE_IF REND RESIZE REVERSE SIZE SORT SPLICE SWAP UNIQUE BEGIN CLEAR EQUAL_RANGE FIND KEY_COMP LOWER_BOUND RBEGIN REND \^° upper_bound value_comp auto_ptr priority_queue queue make_pair pair vector append c_str compare find_first_not_of find_last_not_of find_last_of getline length reserve rfind substr \^° UPPER_BOUND VALUE_COMP AUTO_PTR PRIORITY_QUEUE QUEUE MAKE_PAIR PAIR VECTOR APPEND C_STR COMPARE FIND_FIRST_NOT_OF FIND_LAST_NOT_OF FIND_LAST_OF GETLINE LENGTH RESERVE RFIND SUBSTR \^° devcpp.examples: \^° dofileopensave loadfile savefile createfile readfile writefile getfilesize getfilename getopenfilename getsavefilename getwindowtext setwindowtext registerclassex globalfree globalalloc closehandle \^° DoFileOpenSave LoadFile SaveFile CreateFile ReadFile WriteFile GetFileSize GetFileName GetOpenFileName GetSaveFileName GetWindowText SetWindowText RegisterClassEx GlobalFree GlobalAlloc CloseHandle \^° DOFILEOPENSAVE LOADFILE SAVEFILE CREATEFILE READFILE WRITEFILE GETFILESIZE GETFILENAME GETOPENFILENAME GETSAVEFILENAME GETWINDOWTEXT SETWINDOWTEXT REGISTERCLASSEX GLOBALFREE GLOBALALLOC CLOSEHANDLE \^° winhelp getdc releasedc createwindow createwindowex showwindow updatewindow getwindowtextlength destroywindow movewindow messagebox setfocus zeromemory getobject selectobject deleteobject settimer killtimer \^° WinHelp GetDC ReleaseDC CreateWindow CreateWindowEx ShowWindow UpdateWindow GetWindowTextLength DestroyWindow MoveWindow MessageBox SetFocus ZeroMemory GetObject SelectObject DeleteObject SetTimer KillTimer \^° WINHELP GETDC RELEASEDC CREATEWINDOW CREATEWINDOWEX SHOWWINDOW UPDATEWINDOW GETWINDOWTEXTLENGTH DESTROYWINDOW MOVEWINDOW MESSAGEBOX SETFOCUS ZEROMEMORY GETOBJECT SELECTOBJECT DELETEOBJECT SETTIMER KILLTIMER \^° postmessage getmessage sendmessage peekmessage getdlgitem senddlgitemmessage translatemessage dispatchmessage postquitmessage beginpaint drawtext endpaint cout cin argc argv \^° PostMessage GetMessage SendMessage PeekMessage GetDlgItem SendDlgItemMessage TranslateMessage DispatchMessage PostQuitMessage BeginPaint DrawText EndPaint Cout Cin Argc Argv \^° POSTMESSAGE GETMESSAGE SENDMESS" & _
    "AGE PEEKMESSAGE GETDLGITEM SENDDLGITEMMESSAGE TRANSLATEMESSAGE DISPATCHMESSAGE POSTQUITMESSAGE BEGINPAINT DRAWTEXT ENDPAINT COUT CIN ARGC ARGV \^° enablemenuitem getmenu getsubmenu loadmenu setmenu drawmenubar getclientrect getwindowrect defwindowproc loadicon loadcursor gettextmetrics getstockobject getdlgitem \^° EnableMenuItem GetMenu GetSubMenu LoadMenu SetMenu DrawMenuBar GetClientRect GetWindowRect DefWindowProc LoadIcon LoadCursor GetTextMetrics GetStockObject GetDlgItem \^° ENABLEMENUITEM GETMENU GETSUBMENU LOADMENU SETMENU DRAWMENUBAR GETCLIENTRECT GETWINDOWRECT DEFWINDOWPROC LOADICON LOADCURSOR GETTEXTMETRICS GETSTOCKOBJECT GETDLGITEM^"
    $keywordclass_functions = StringReplace($keywordclass_functions, "^", @CRLF)
    $keywordclass_functions = StringReplace($keywordclass_functions, "°", chr(9))
    Dim $keywordclass_defines = "" & _
    "keywordclass.defines= \^° standart: \^° HGLRC MSG HDC HWND HWND_DESKTOP WM_SIZE WM_PAINT WM_CREATE WM_DESTROY WM_CLOSE WM_QUIT WM_TIMER WM_COMMAND CLIENTCREATESTRUCT WPARAM LPARAM WPARAM GPTR HINSTANCE WNDCLASSEX WM_CREATE IDI_APPLICATION IDC_ARROW \^° MB_ICONEXCLAMATION MB_OK WS_EX_APPWINDOW WS_OVERLAPPEDWINDOW WS_CLIPCHILDREN CW_USEDEFAULT CW_USEDEFAULT CW_USEDEFAULT CW_USEDEFAULT HMENU WS_CHILD WS_VISIBLE BS_PUSHBUTTON WS_EX_CLIENTEDGE MB_SYSTEMMODAL \^° OPENFILENAME OFN_EXPLORER OFN_PATHMUSTEXIST OFN_HIDEREADONLY OFN_OVERWRITEPROMPT OFN_FILEMUSTEXIST GENERIC_READ FILE_SHARE_READ OPEN_EXISTING FILE_ATTRIBUTE_NORMAL INVALID_HANDLE_VALUE GENERIC_WRITE CREATE_ALWAYS \^° WS_CAPTION WS_POPUPWINDOW WS_VISIBLE IDC_MAIN_TEXT DEFAULT_GUI_FONT MAKELPARAM SIZE_MINIMIZED WM_SETFONT LPCREATESTRUCT CS_DBLCLKS ID_MENU MAKEINTRESOURCE TEXTMETRIC SYSTEM_FIXED_FONT^"
    $keywordclass_defines = StringReplace($keywordclass_defines, "^", @CRLF)
    $keywordclass_defines = StringReplace($keywordclass_defines, "°", chr(9))
    ; Ende ==> cpp.keywords.properties

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($Progress1, GUICtrlRead($Progress1)+10)
    GUICtrlSetData($StatusLabel, "GettingKeywords")
    Local $AllIncludeFiles[1], $SyntaxCheck[1], $DefineLine, $IncludeLine, $JustUnknown_functions, $JustUnknownLine, $i = 1

    [/autoit] [autoit][/autoit] [autoit]

    ; Abfrage ob schon ein Erweitertes Highlighting vorhanden ist
    if FileExists($FileCppKeywordsProperties) then
    _FileReadToArray($FileCppKeywordsProperties, $SyntaxCheck)
    if StringInStr($SyntaxCheck[6], "Advanced", 1) Then
    if MsgBox(4, "GettingKeywords", "Es ist schon ein Erweitertes Syntax-Highlighting vorhanden." & @CRLF & @CRLF & "Soll es überschrieben werden?") = 7 then
    $message &= @CRLF & 'Das erweiterte C++ Syntaxhighlighting wurde beibehalten.'
    Return
    EndIf
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Das Standart Syntax-Highlighting erstellen
    $PropertiesFileHeader = "" & _
    "# Cpp Keyword Defines" & @CRLF & _
    "#" & @CRLF & _
    "# 2010 - Techmix" & @CRLF & _
    "#" & @CRLF & _
    "#" & @CRLF & _
    "# Generatet for Basicly" & @CRLF & _
    "# C++ Syntax-Highlighting." & @CRLF & _
    "# Created by SciTEexecuter" & @CRLF & _
    "" & @CRLF
    $PropertiesFileKeywords = ""& _
    $PropertiesFileHeader & _
    $keywordclass_keywords & @CRLF & _
    $keywordclass_functions & @CRLF & _
    $keywordclass_defines & @CRLF
    ; 'cpp.keywords.properties' Schreiben
    $WriteFile=FileOpen($FileCppKeywordsProperties , 10)
    FileWrite($WriteFile, $PropertiesFileKeywords)
    FileClose($WriteFile)

    [/autoit] [autoit][/autoit] [autoit]

    if GUICtrlRead($CheckSyntax) <> 1 then
    $message &= @CRLF & 'Das standart C++ Syntaxhighlighting wurde erstellt.'

    [/autoit] [autoit][/autoit] [autoit]

    ; Das Erweiterte Syntax-Highlighting erstellen
    Else
    $keywordclass_functions = StringTrimRight($keywordclass_functions, 2)
    $keywordclass_functions &= " \ " & @CRLF & _
    chr(9) & " cppapi: \" & @CRLF & chr(9) & " "
    $keywordclass_defines &= " \ " & @CRLF & _
    chr(9) & " cppapi: \" & @CRLF & chr(9) & " "
    $JustUnknown_functions &= "" & _
    chr(9) & " cppapiunknown: \" & @CRLF & chr(9) & " "

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Die alte AU3 Funktion brauchte 1783 Sekunden
    ; Die neue C Funktion benötigt NUR 44.48 Sekunden!!!!!
    $TimerCpp = TimerInit()
    ; Die AU3 Variablen in ein besseres Format bringen
    Local $TempKeywordclass_keywords
    $TempKeywordclass_keywords = StringReplace($keywordclass_keywords, "\" & @CRLF, "")
    $TempKeywordclass_keywords = StringReplace($TempKeywordclass_keywords, chr(9) & " ", "")
    $TempKeywordclass_keywords = StringReplace($TempKeywordclass_keywords, " \ " & @CRLF, "")
    $TempKeywordclass_keywords = StringReplace($TempKeywordclass_keywords, @CRLF, "")
    Local $TempKeywordclass_functions
    $TempKeywordclass_functions = StringReplace($keywordclass_functions, "\" & @CRLF, "")
    $TempKeywordclass_functions = StringReplace($TempKeywordclass_functions, chr(9) & " ", "")
    $TempKeywordclass_functions = StringReplace($TempKeywordclass_functions, " \ " & @CRLF, "")
    $TempKeywordclass_functions = StringReplace($TempKeywordclass_functions, @CRLF, "")
    Local $TempKeywordclass_defines
    $TempKeywordclass_defines = StringReplace($keywordclass_defines, "\" & @CRLF, "")
    $TempKeywordclass_defines = StringReplace($TempKeywordclass_defines, chr(9) & " ", "")
    $TempKeywordclass_defines = StringReplace($TempKeywordclass_defines, " \ " & @CRLF, "")
    $TempKeywordclass_defines = StringReplace($TempKeywordclass_defines, @CRLF, "")
    Local $TempJustUnknown_functions
    $TempJustUnknown_functions = StringReplace($JustUnknown_functions, "\" & @CRLF, "")
    $TempJustUnknown_functions = StringReplace($TempJustUnknown_functions, chr(9) & " ", "")
    $TempJustUnknown_functions = StringReplace($TempJustUnknown_functions, " \ " & @CRLF, "")
    $TempJustUnknown_functions = StringReplace($TempJustUnknown_functions, @CRLF, "")
    Local $TempKeywordclass_Makros ; Neu hinzufügen!!
    Local $TempFileCppApi
    $TempFileCppApi = StringReplace($FileCppApi, "\", "/") ; Den Path im UNIX-Style übergeben - gibt sonst Fehlermeldungen!

    [/autoit] [autoit][/autoit] [autoit]

    Local $Cpp = CppInit("cpp") ; Ein C 'Objekt' erstellen und mit dem C++ Compiler Kompilieren
    CppAdd($Cpp, '' & _
    '//~ =======================================================================================================================' & @CRLF & _
    '//~ Diese C Funktion habe ich eingebaut um eine AutoIt Funktion erheblich beschleunigen zu können. ' & @CRLF & _
    '//~ Die orginale AutoIt Funktion brauchte 1783 Sekunden und die neue C Funktion braucht nur 44.48 Sekunden!' & @CRLF & _
    '//~ Die Cpp-UDF, welche bestandteil des SciTEexecuter ist, scheint sehr wirkungsvoll zu sein ;)' & @CRLF & _
    '//~' & @CRLF & _
    '//~ Das Erweiterte Syntax-Highlighting erstellen:' & @CRLF & _
    '//~ Die *\AutoIt\SciTE\api\cpp.api enthält die Auszulesenden Keywords' & @CRLF & _
    '//~ Diese Datei wird ausgelesen und Stück für Stück mit den Keywords-Einträgen verglichen: [T]' & @CRLF & _
    '//~ Keywordclass_Keywords, Keywordclass_Functions, Keywordclass_Defines, JustUnknown_Functions [T]' & @CRLF & _
    '//~ Wenn ein Eintrag __ am Anfang hat ist ist es ein Keywordclass_Macro [T]' & @CRLF & _
    '//~ Wenn alles Großgeschrieben ist ist es eine Keywordclass_Defines (Auch wenn es Groß ist und _ enthält) [T]' & @CRLF & _
    '//~ Wenn ein Eintrag eine ( enthält ist es eine Keywordclass_Functions [T]' & @CRLF & _
    '//~ Sollten die ersten beiden Regeln nicht greifen ist es eine JustUnknown_Functions [T]' & @CRLF & _
    '//~ Anschliessend werden die Werte mit dem StdOut Stream zurückgegeben. [T]' & @CRLF & _
    '//~' & @CRLF & _
    '//~ [T] ist alles erledigt :D' & @CRLF & _
    '//~' & @CRLF & _
    '//~ =======================================================================================================================' & @CRLF & _
    '#include <ctype.h>' & @CRLF & _
    '#include <stdio.h>' & @CRLF & _
    '#include <string.h>' & @CRLF & _
    '#include <windows.h>' & @CRLF & _
    'const int ArraySize = 768 * 512;' & @CRLF & _
    '//~ AutoIt Variablen-Übergabe:' & @CRLF & _
    'char FileCppApi[] = "' & $TempFileCppApi & '";' & @CRLF & _
    'char Keywordclass_Keywords[ArraySize] = "' & $TempKeywordclass_keywords & '";' & @CRLF & _
    'char Keywordclass_Functions[ArraySize] = "' & $TempKeywordclass_functions & '";' & @CRLF & _
    'char Keywordclass_Defines[ArraySize] = "' & $TempKeywordclass_defines & '";' & @CRLF & _
    'char JustUnknown_Functions[ArraySize] = "' & $TempJustUnknown_functions & '";' & @CRLF & _
    'char Keywordclass_Makros[ArraySize] = "__A";' & @CRLF & _
    '//~ Hauptprogramm' & @CRLF & _
    'int main(){' & @CRLF & _
    ' int LenStringSplitCheck;' & @CRLF & _
    ' char StringSplitCheck[1];' & @CRLF & _
    ' char StringSplitCppApi[196];' & @CRLF & _
    ' FILE * pFile;' & @CRLF & _
    ' pFile = fopen (FileCppApi,"r");' & @CRLF & _
    ' fscanf (pFile, "%s", StringSplitCppApi);' & @CRLF & _
    ' while (!feof(pFile))' & @CRLF & _
    ' {' & @CRLF & _
    ' // Ab hier werden die cpp.api Einträge nach und nach abgearbeitet' & @CRLF & _
    ' int LenStringSplitCppApi = strlen(StringSplitCppApi);' & @CRLF & _
    ' // Ein neues Makro?' & @CRLF & _
    ' if(strncmp("__", StringSplitCppApi, 2) == 0 && strstr(Keywordclass_Makros, StringSplitCppApi) == 0)' & @CRLF & _
    ' {' & @CRLF & _
    ' strncat(Keywordclass_Makros, " ", 1);' & @CRLF & _
    ' strncat(Keywordclass_Makros, StringSplitCppApi, LenStringSplitCppApi);' & @CRLF & _
    ' }' & @CRLF & _
    ' else' & @CRLF & _
    ' {' & @CRLF & _
    ' // Ist es schon in den Keywordclass_Keywords?' & @CRLF & _
    ' if(strstr(Keywordclass_Keywords, StringSplitCppApi) == 0)' & @CRLF & _
    ' {' & @CRLF & _
    ' // Der Eintrag ist noch nicht vorhanden, ab hier zählen die Regeln!' & @CRLF & _
    ' // Functions-Regel' & @CRLF & _
    ' if(strstr(StringSplitCppApi, "(") != 0)' & @CRLF & _
    ' {' & @CRLF & _
    ' int Split = strcspn(StringSplitCppApi, "(");' & @CRLF & _
    ' char StringSplitCheck[Split];' & @CRLF & _
    ' strncat(StringSplitCheck, StringSplitCppApi, Split);' & @CRLF & _
    ' int LenStringSplitCheck = strlen(StringSplitCheck);' & @CRLF & _
    ' if(strstr(Keywordclass_Functions, StringSplitCheck) == 0 )' & @CRLF & _
    ' {' & @CRLF & _
    ' strncat(Keywordclass_Functions, " ", 1);' & @CRLF & _
    ' strncat(Keywordclass_Functions, StringSplitCheck, LenStringSplitCheck);' & @CRLF & _
    ' }' & @CRLF & _
    ' }' & @CRLF & _
    ' // Defines-Regel' & @CRLF & _
    ' else' & @CRLF & _
    ' {' & @CRLF & _
    ' char c;' & @CRLF & _
    ' int i = 0;' & @CRLF & _
    ' int j = 0;' & @CRLF & _
    ' while(StringSplitCppApi[i])' & @CRLF & _
    ' {' & @CRLF & _
    ' c = StringSplitCppApi[i];' & @CRLF & _
    ' if (isupper(c) or isdigit(c) or ispunct(c)) j++;' & @CRLF & _
    ' i++;' & @CRLF & _
    ' }' & @CRLF & _
    ' if(strstr(Keywordclass_Defines, StringSplitCppApi) == 0 and j == LenStringSplitCppApi)' & @CRLF & _
    ' {' & @CRLF & _
    ' strncat(Keywordclass_Defines, " ", 1);' & @CRLF & _
    ' strncat(Keywordclass_Defines, StringSplitCppApi, LenStringSplitCppApi);' & @CRLF & _
    ' }' & @CRLF & _
    ' // Regeln haben nichts bewirkt,' & @CRLF & _
    ' // also ist es eine JustUnknown_Function' & @CRLF & _
    ' else if(strstr(JustUnknown_Functions, StringSplitCppApi) == 0 and strchr(StringSplitCppApi, ' & chr(39) & ')' & chr(39) & ') == 0 and strchr(StringSplitCppApi, ' & chr(39) & '*' & chr(39) & ') == 0 and strchr(StringSplitCppApi, ' & chr(39) & ',' & chr(39) & ') == 0 and strchr(StringSplitCppApi, ' & chr(39) & '[' & chr(39) & ') == 0)' & @CRLF & _
    ' {' & @CRLF & _
    ' strncat(JustUnknown_Functions, " ", 1);' & @CRLF & _
    ' strncat(JustUnknown_Functions, StringSplitCppApi, LenStringSplitCppApi);' & @CRLF & _
    ' }' & @CRLF & _
    ' }' & @CRLF & _
    ' }' & @CRLF & _
    ' }' & @CRLF & _
    ' // Nächster Eintrag' & @CRLF & _
    ' fscanf (pFile, "%s", StringSplitCppApi);' & @CRLF & _
    ' }' & @CRLF & _
    ' fclose (pFile);' & @CRLF & _
    ' puts(Keywordclass_Keywords);' & @CRLF & _
    ' puts(Keywordclass_Makros);' & @CRLF & _
    ' puts(Keywordclass_Defines);' & @CRLF & _
    ' puts(Keywordclass_Functions);' & @CRLF & _
    ' puts(JustUnknown_Functions);' & @CRLF & _
    '}' )

    [/autoit] [autoit][/autoit] [autoit]

    CppCompile($Cpp) ; Programmcode Kompilieren
    CppStdOut($Cpp) ; Einen Rückgabewert über den Stdout Stream abfangen

    [/autoit] [autoit][/autoit] [autoit]

    Local $return = CppExecute($Cpp) ; Programmcode ausführen und den Rückgabewert auffangen - stdout char
    $TimerCpp = TimerDiff($TimerCpp) / 1000
    MsgBox(262144,'Debug line ~' & @ScriptLineNumber,"Benötigte Zeit : " & $TimerCpp & " Sekunden" & @lf & @lf & 'Selection:' & @lf & '$return' & @lf & @lf & 'Return:' & @lf & $return & @CRLF) ;### Debug MSGBOX
    CppExit($Cpp) ; C Objekt wieder freigeben
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    EndIf
    EndFunc

    [/autoit]

    Man benötigt bloß eine Installation des SciTEexecuter und dann kann man die Funktion direkt testen :thumbup:
    Und Danke noch für die Hilfestellungen!!!

    Grüsse von Techmix!