Meldung: 'Zugriffsverletzung bei Adresse 00401D6D in Modul 'Word.exe'



  • ---------------------------
    Benachrichtigung über Debugger-Exception
    ---------------------------
    Im Projekt Word.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 00401D6D in Modul 'Word.exe'. Lesen von Adresse 00000000'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.

    Beim Compilieren von folgendem Quelltext ...

    #include "WordU.h"
    
    //Special Header für Anwendung ...
    #include <stdio.h>
    #include <windows.h>
    #include <ole2.h>
    #include <locale.h>
    #include "iostream.h"
    //Special Header Ende !!
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
      //DateiName + Pfad des Word-Dokumentes !!!
      AnsiString DateiName = "D:\\test.doc";
    
      //Umwandeln von AnsiString in wchar_t !!!
      wchar_t *RealDateiName = WideString(DateiName.c_str());
    
      //Festlegen von Standard "Variablen" ...
      IStorage *pStorage = NULL;
      IPropertySetStorage *pPropSetStg = NULL;
      HRESULT hr;
    
      //Dokument als OLE-Instanz öffnen ...
      hr = StgOpenStorage(RealDateiName, NULL, STGM_READ | STGM_SHARE_EXCLUSIVE, NULL, 0, &pStorage);
    
      //Dokumenteigenschaften als Referenz extrahiern ?
      hr = pStorage -> QueryInterface(IID_IPropertySetStorage, (void **)&pPropSetStg);
    
      //Aufruf der Methoden zum Auslesen aus der Referenz ...
        DumpCustomProps(pPropSetStg);
    }
    //---------------------------------------------------------------------------
    
    void DumpCustomProps(IPropertySetStorage *pPropSetStg)
    {  //Ließt Custom-Document-Properties
    
       //Festlegen von Standard "Variablen" ...
       IPropertyStorage *pPropStg = NULL;
       HRESULT hr;
       IEnumSTATPROPSTG *pEnumProp;
    
       //Benutzerdefinierte Properties öffnen ...
       hr = pPropSetStg -> Open(FMTID_UserDefinedProperties, STGM_READ | STGM_SHARE_EXCLUSIVE, &pPropStg);
    
       //Auflistung der benutzerdefinierte Properties ...
       STATPROPSTG sps;
       ULONG fetched;
       PROPSPEC propSpec[1];
       PROPVARIANT propVar[1];
    
       while (pEnumProp -> Next(1, &sps, &fetched) == S_OK)
       {
         //Wenn b.-property gefunden -> Referenz zum verwenden schaffen ...
         ZeroMemory(&propSpec[0], sizeof(PROPSPEC));
         propSpec[0].ulKind = PRSPEC_PROPID;
         propSpec[0].propid = sps.propid;
    
         //Eigenschaft lesen
         hr = pPropStg -> ReadMultiple(1, &propSpec[0], &propVar[0]);
    
         //Wenn lesen positiv ... >>
         if (!FAILED(hr))
         {
           //EigenschaftenName in ASCII ...
           char dbcs[1024];
           char *pbstr = (char *)sps.lpwstrName;
           int i = wcstombs(dbcs, sps.lpwstrName, *((DWORD *)(pbstr -4)));
           dbcs[i] = 0;
    
           //Wert der propertie auslesen ...
           printf("%16s: ", dbcs);
           DumpPropVariant(&propVar[0]);
         }
       }
    }
    
    void DumpPropVariant(PROPVARIANT *pPropVar)
    {  //Funktion unbekannt ...
    
      if (pPropVar -> vt & VT_BYREF)
      {
        printf("(Array)\n");
        return;
      }
    
      if (pPropVar -> vt & VT_BYREF)
      {
        printf("(ByRef)\n");
        return;
      }
    
      // Switch types.
      switch (pPropVar -> vt)
      {
        case VT_EMPTY:
          printf("(VT_EMPTY)\n");
          break;
        case VT_NULL:
          printf("(VT_NULL)\n");
          break;
        case VT_BLOB:
          printf("(VT_BLOB)\n");
          break;
        case VT_BOOL:
          printf("%s (VT_BOOL)\n", pPropVar->boolVal ? "TRUE/YES" : "FALSE/NO");
          break;
        case VT_I2: // 2-byte signed int.
          printf("%d (VT_I2)\n", (int)pPropVar->iVal);
          break;
        case VT_I4: // 4-byte signed int.
          printf("%d (VT_I4)\n", (int)pPropVar->lVal);
          break;
        case VT_R4: // 4-byte real.
          printf("%.2lf (VT_R4)\n", (double)pPropVar->fltVal);
          break;
        case VT_R8: // 8-byte real.
          printf("%.2lf (VT_R8)\n", (double)pPropVar->dblVal);
          break;
        case VT_BSTR: // OLE Automation string.
        {
          // Translate into ASCII.
          char dbcs[1024];
          char *pbstr = (char *)pPropVar -> bstrVal;
          int i = wcstombs(dbcs, pPropVar -> bstrVal, *((DWORD *)(pbstr -4)));
          dbcs[i] = 0;
          printf("%s (VT_BSTR)\n", dbcs);
        }
          break;
        case VT_LPSTR: // Null-terminated string.
        {
          printf("%s (VT_LPSTR)\n", pPropVar->pszVal);
        }
          break;
        case VT_FILETIME:
        {
          char *dayPre[] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
    
            FILETIME lft;
            FileTimeToLocalFileTime(&pPropVar->filetime, &lft);
            SYSTEMTIME lst;
            FileTimeToSystemTime(&lft, &lst);
    
            printf("%02d:%02d.%02d %s, %s %02d/%02d/%d (VT_FILETIME)\n",
                   1+(lst.wHour-1)%12, lst.wMinute, lst.wSecond,
                   (lst.wHour>=12) ? "pm" : "am",
                   dayPre[lst.wDayOfWeek%7],
                   lst.wMonth, lst.wDay, lst.wYear);
        }
          break;
        case VT_CF: // Clipboard format.
          printf("(Clipboard format)\n");
          break;
    
        default: // Unhandled type, consult wtypes.h's VARENUM structure.
          printf("(Unhandled type: 0x%08lx)\n", pPropVar->vt);
          break;
      }
    }
    

    bekomm ich in der Zeile

    while (pEnumProp -> Next(1, &sps, &fetched) == S_OK)
    

    oben gennante Fehlermeldung ...........

    Hab leider keine Ahnung warum ... bitte helfen ...

    Mfg Blade



  • Hallo,
    was hälst du davon, pEnumProp zu initialisieren?



  • ... komm schon gib mir nen Tip ...

    was muss ich damti sonst noch machen ??

    IEnumSTATPROPSTG *pEnumProp;
    


  • initialisieren bedeutet einen Anfangswert zuweisen.



  • bitte bitte sag mir doch mal mit was?? das is nen code von der ms knowledge base und ich hab den porobiert in bcb6 zu übersetzen ... bzw. übernehmen .. hat auch geklappt nur jez nis da halt der fehler .. naja und ich weiß nich womit ich das initialisieren soll ...



  • 666Blade[DC]666 schrieb:

    ... komm schon gib mir nen Tip ...

    was muss ich damti sonst noch machen ??

    IEnumSTATPROPSTG *pEnumProp;
    

    wie waere es mit sowas wie

    IEnumSTATPROPSTG *pEnumProp;
    pEnumProp = new IEnumSTATPROPSTG( /*vieleicht Parameter*/);
    

    sonst ist es ja nur ein Zeiger der ins nichts zeigt.

    ps.: ich hoffe ich hab nichts zu überflüssiges gesagt 😞



  • Also das hier kann keinen geben.

    void DumpCustomProps(IPropertySetStorage *pPropSetStg)
    

    Zum Vergleich mal ne andere Zeile aus einem Code

    __fastcall TForm1::TForm1(TComponent* Owner) 
            : TForm(Owner)
    

    na fällt dir der Unterschied auf? 😉

    IEnumSTATPROPSTG
    

    ist dem BCB (ich geh mal stark davon aus, das du diesen benutzt) leider unbekannt, zumindest finde ich diese Variable/Struktur/Klasse (😕) nicht in der Hilfe vom BCB 6 Enterprise. Und beim initilisieren bekomme ich die Meldeung "Typename expected", evtl muss man ja auch irgendwelche weiteren Includes machen (weiß aber leider nicht welche... :()



  • PuppetMaster2k schrieb:

    Also das hier kann keinen geben.

    void DumpCustomProps(IPropertySetStorage *pPropSetStg)
    

    Zum Vergleich mal ne andere Zeile aus einem Code

    __fastcall TForm1::TForm1(TComponent* Owner) 
            : TForm(Owner)
    

    na fällt dir der Unterschied auf? 😉

    Ja und zwar das es eine ganz normale Funktion ist und rein gar nichts mit einer Klasse
    zu tun hat.

    mfg
    v R



  • 666Blade[DC]666 schrieb:

    ... komm schon gib mir nen Tip ...

    was muss ich damti sonst noch machen ??

    IEnumSTATPROPSTG *pEnumProp;
    

    Vielleicht schaust du einfach mal hier rein.

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/stg/stg/ienumstatpropstg_compound_file_implementation.asp

    Joe



  • das sieht vielversprechend aus ... @JoeIntel .... nur irgendwie blick ich nich durch ... warum bekomm ich die Fehlermeldung und wie muss ichs machen damit es funktioniert ?



  • 666Blade[DC]666 schrieb:

    das sieht vielversprechend aus ... @JoeIntel .... nur irgendwie blick ich nich durch ... warum bekomm ich die Fehlermeldung und wie muss ichs machen damit es funktioniert ?

    Na ja ich kenn mich da nicht aus aber ich tippe mal auf

    IEnumSTATPROPSTG *pEnumProp = NULL; 
    
       //Benutzerdefinierte Properties öffnen ... 
       hr = pPropSetStg -> Open(FMTID_UserDefinedProperties, STGM_READ | STGM_SHARE_EXCLUSIVE, &pPropStg); 
    
       //Auflistung der benutzerdefinierte Properties ... 
       STATPROPSTG sps; 
       ULONG fetched; 
       PROPSPEC propSpec[1]; 
       PROPVARIANT propVar[1];
    //----> 
       if (pEnumProp->Enum( &pEnumProp) != S_OK)
          return;
    //<---
       while (pEnumProp -> Next(1, &sps, &fetched) == S_OK) 
       {
    


  • pEnumProp -> Enum geht nicht weils laut BCB keine Eigenschaft oder Funktion gibt von dem Objekttyp von pEnumProp.
    Bin jez wieder am Anfang und auf eure Hilfe angewiesen!!



  • 666Blade[DC]666 schrieb:

    pEnumProp -> Enum geht nicht weils laut BCB keine Eigenschaft oder Funktion gibt von dem Objekttyp von pEnumProp.
    Bin jez wieder am Anfang und auf eure Hilfe angewiesen!!

    War halt ein tippfehler Copy and Waste nimm halt das

    if (pStorage->Enum( &pEnumProp) != S_OK)
    

    Ich würde dir aber Grundsätzlich erst mal empfehlen dich mit weniger komplizierten Problemen zu beschäftigen. Denn mir scheint das deine C++ Kenntnisse nicht wirklich dem Problem angemessen sind um es mal Diplomatisch auszudrücken. Dieses Forum ist nicht dafür da komplette Programme für jemanden zu debuggen.

    In diesem Sinne

    Joe



  • Wohl wahr wohl wahr ... JoeIntel ... in der Tat sind meine C++ Kenntnisse zu diesem Zeitpunkt wirklich überfordert. Deswegen erhoffte ich mir bei euch eine Lösung zu finden. Aufgabenstellung war es ein Programm zu konstuieren welches die Custom Document Prperties von Word ausliest und verändern kann. Da dadurch die Buchhaltung optimiert werden sollte lag für mich der Hauptteil der Aufgabe auf dem Entwurf einer Datenbank aus der Informationen für diese Properties bezogen werden sollten. In der Knowledge Base habe ich ein Konsolenbeispiel in VC++ gefunden und habe dieses Probiert erst umzusetzten um es dann für meine Bedürfnisse zu erweitern. Der Aufwand mich in die OLE Automation (dürfte so heißen .. ?) einzuarbeiten wäre zu groß gewesen um das ganze 100% selber zu entwerfen ... trotzdem Danke an euch ....

    Blade -> PlanB();



  • es gab mal (oder es gibt sie immer noch) zeiten, in denen ich etwas mehr als 50 Zeilen einfachen code gepostet habe und von einigen admins hier den vogel gezeigt bekam wer sich denn hier den ganzen kram anschauen soll. Der code in diesem post ist dagegen schon riesig und der poster bekommt richtig nett antworten zu allem moeglichen details.
    respekt, respekt (ich weiss nur noch nicht wem ich diesen respekt zollen soll, den admins oder dem poster!?!)

    gruss.


Anmelden zum Antworten