1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

System.Runtime.InteropServices.SEHException bei rekursiven Methodenaufruf?

  • Sphero
  • 16. Oktober 2011 um 00:29
  • Unerledigt
  • Sphero
    2
    Sphero
    Mitglied
    Punkte
    25
    Beiträge
    3
    • 16. Oktober 2011 um 00:29
    • #1

    Servus,

    ich habe folgenden Code mit Visual Studio 2010 erstellt...

    Code
    void MarshalString ( String ^ s, string& os ) {
            using namespace Runtime::InteropServices;
            const char* chars = (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();
            os = chars;
            Marshal::FreeHGlobal(IntPtr((void*)chars));
        }
    
    
    
        string filesys(HANDLE hSearch, string prepath) {
    
    
            string doit = "";
            WIN32_FIND_DATA FData;
    
    
            if (hSearch == INVALID_HANDLE_VALUE) {doit += "ungültige suche!";}
            do {
                ////////////////////////////////////////////////////////
                // Umwandlungen
                    char ch[260];
                    char DefChar = ' ';
                    WideCharToMultiByte(CP_ACP,0,FData.cFileName,-1, ch,260,&DefChar, NULL);
                    string foldername(ch);
    
                ////////////////////////////////////////////////////////
                // Gültiger Ordner
                if (FData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY && foldername != "..") {
                    //doit += "mput *.*\n";
                    doit += foldername + "\n";
                    string path = prepath + foldername + "\\\\";
                    string newsearch = prepath + foldername + "\\\\*";
                    LPCWSTR newsearchpath = s2ws(newsearch);
                    WIN32_FIND_DATA FData;
                    HANDLE rekus = (newsearchpath,&FData);
                    doit += path;
                    doit += this->filesys(rekus, path);
                }
            } while (FindNextFile(hSearch,&FData) != 0);
    
    
            FindClose(hSearch);
            return doit;
        }
    
    
        LPCWSTR s2ws(const std::string& s) {
            int len;
            int slength = (int)s.length() + 1;
            len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); 
            wchar_t* buf = new wchar_t[len];
            MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
            LPCWSTR r(buf);
            delete[] buf;
            return r;
        }
        }
    Alles anzeigen

    Ich versuche mit der Methode einen Subfolder (hier installer_stable) rekursiv durchsuchen zu lassen, damit ich mir später eine FTP-Command-File erstellen kann die mir dann die Ordner erstellt und alle Files hochläd. Das Problem hier: wenn ich die Methode rekursiv aufrufen lassen will, bekomm ich eine System.Runtime.InteropServices.SEHException. Bin jetzt noch nicht soo lange bei C++ dass mir das irgendwas sinnvolles sagen könnte.. hab nach der Exception gegooglet, aber is nicht wirklich was gescheites bei rausgekommen... In der MartialString Methode kommt der Namespace vor, deshalb hab ich die einfahc mal mitgepostet...

    wäre super wenn sich jemand die Zeit nehmen könnte und da mal schnell drübergucken kann... langsam verzweifel ich an dem teil, zwischendurch hats mal funktioniert, dann ging garnichts und musste quasi wieder bei 0 anfangen.. :-S

    mfg Sphero

  • Ringding
    11
    Ringding
    Mitglied
    Reaktionen
    12
    Punkte
    1.237
    Beiträge
    244
    • 17. Oktober 2011 um 11:25
    • #2

    s2ws gibt einen Pointer auf Speicher zurück, der gelöscht wurde. Das kann nicht funktionieren.

  • Sphero
    2
    Sphero
    Mitglied
    Punkte
    25
    Beiträge
    3
    • 17. Oktober 2011 um 14:30
    • #3

    hab die Methode ausm Internet... aber egal, habs jetzt anders gelöst.
    hab das ganze filesystem-durchsuchen in ne mfc anwendung ausgelagert (innerhalb ging net weil ich beinm compilern/linken irgendwelche befehle hatte, die die funktion die ich dann benutz hab, nicht mochte).

    das ding hat mich echt nerven gekostet... aber naja nu läufts, hier der code, falls es für jemanden von interesse ist. Das programm gibt die Befehle für nen FTP programm aus, welche man mit > ftp.txt zbs. speichern kann...

    C
    // filesys.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    #include "stdafx.h"
    #include <afx.h>
    #include <string>
    #include <stdio.h>
    #include <iostream>
    #include <iostream>
    #include <ios>
    #include <ostream>
    #include <fstream>
    #include <Windows.h>
    #include <cmdtree.h>
    using namespace std;
    char* conversion(LPCTSTR val);
    CString filesys(CString path);
    char* cstr2ch(CString str);
    void tch2ch(const wchar_t* Src, char* Dest, int Size);
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
        char *ftpkram = "open dodo-pwns.de\nweb323\nWagner\ncd html\nmkdir uploadtest\ncd uploadtest\nprompt\n";
        //printf(ftpkram);
        CString suche = "C:\\temp\\installer_stable\\";
        filesys(suche);
        char *bye = "bye\n";
        printf(bye);
        return 0;
    }
    char* conversion(LPCTSTR val)
    {
     LPCWSTR wstr = val; 
     int count = wcslen(wstr);
     char* c = new char[count + 1]; 
     wchar_t* pwchr = const_cast<wchar_t*> (&wstr[0]);
     for(int j = 0; j < count; ++j)
     {
        c[j] = static_cast<char> (*pwchr);   
        pwchr++;
     }    
     c[count] = '\0';  
     wchar_t *op; 
     wcstombs(c,val,count);
     return c;
    }
    CString filesys(CString path) {
            CString result = "";
            char *breaker = "\n";
            char *mput = "mput ";
            char *back = "cd ..\n";
            char *mkdir = "mkdir ";
            char *cd = "cd ";
            char *stars = "\\*.*";
            char *pp = "..";
            BOOL finderFound = TRUE;
            CFileFind finder;
            CString searchString = path + "*";
            finderFound = finder.FindFile(searchString);
            BOOL wasFolder = FALSE;
            char *empty = "";
            int oncemore = 1;
                while (finderFound) {
                        LPCWSTR wstr = finder.GetFileTitle();
                        char *output = conversion(wstr);
                    if (finder.IsDirectory() && !finder.IsDots()) {
                            char* folder = "folder: ";
                            //printf(folder);printf(output);printf(breaker);
                            char *ort = cstr2ch(path);
                            // mkdir *folder*\n
                            printf(mkdir);printf(output);printf(breaker);
                            // cd *folder*\n
                            printf(cd);printf(output);printf(breaker);
                            CString fullpath = path + output;
                            char * pathing = cstr2ch(fullpath);
                            //printf(pathing);printf(breaker);
                            // mput *pathtofolder*\*.*
                            printf(mput);printf(pathing);printf(stars);printf(breaker);
                            CString newpath = path + output + "\\";
                            filesys(newpath);
                            // cd ..\n
                            printf(cd);printf(pp);printf(breaker);
                    }
                    /*else if (!finder.IsDots() && output != empty) {
                            char* file = "file: ";
                            printf(file);printf(output);printf(breaker);
                    }*/
    
                    finderFound = finder.FindNextFile();
                    if (!finderFound && oncemore == 1) {
                        oncemore = 0;
                        finderFound = TRUE;
                    }
    
                }
                finder.Close();
                return result;
    }
    char * cstr2ch(CString str) {
        const size_t StringSize = 10000;
        size_t CharactersConverted = 0;
        char DummyToChar[StringSize];
        wcstombs_s(&CharactersConverted, DummyToChar, 
               str.GetLength()+1, str, 
               _TRUNCATE);
    return DummyToChar;
    }
    void tch2Ch(const wchar_t* Src, char* Dest, int Size)
        {
            WideCharToMultiByte(CP_ACP, 0, Src, wcslen(Src)+1, Dest , Size, NULL, NULL);
        }
    Alles anzeigen

    Wahrscheinlich ziemlich unsauber, aber funktioniert...

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung