AVISTREAM



  • Hallo,

    ich möchte gern ein Avi-Interface mittels

    C++/CLI hat nur einen einzigen Zweck, nämlich managed/unmanaged Interop.

    C++/CLI (VC2008 Professional) erstellen und hatte mich dafür an einem ähnlichem Interface für c# orientiert:

    [url]
    http://www.adp-gmbh.ch/csharp/avi/write_avi.html
    [/url]

    Im Speziellen geht es mir um die AVISTREAMINFOW Struktur, die ich an
    AVIFileCreateStream(pfile_, ps_, %strhdr);
    übergeben möchte. Hier ist die bisherige Definition:

    [StructLayout(LayoutKind::Sequential, Pack = 1)] 
     public ref struct RECTa 
             { 
                     int left; 
                     int top; 
                     int right; 
                     int bottom; 
             };
    
    [StructLayout(LayoutKind::Sequential, Pack=1)]
    public ref struct AVISTREAMINFOW {      
    static  DWORD fccType;
    static  DWORD fccHandler;
    static  DWORD dwFlags;
    static  DWORD dwCaps;
    static  WORD  wPriority;
    static  WORD  wLanguage;
    static  DWORD dwScale;
    static  DWORD dwRate;
    static  DWORD dwStart;
    static  DWORD dwLength;
    static  DWORD dwInitialFrames;
    static  DWORD dwSuggestedBufferSize;
    static  DWORD dwQuality;
    static  DWORD dwSampleSize;
    static  RECTa  rcFrame;  // ???
    static  DWORD dwEditCount;
    static  DWORD dwFormatChangeCount; 
    static char * szName = (char *)malloc(64*sizeof(char));
    
    };
    

    Leider stürzt die Anwendung mit der Fehlermeldung „Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.“ ab.
    Ich nehme an, dass es an der "RECTa" Struktur liegt. Vielleicht hat ja jemand bereits diesen Weg beschritten und kann hier mitteilen, wie ein geeigneter Warper für die AVISTREAMINFOW Struktur aussehen könnte.

    Vielen Dank schon mal fürs lesen



  • Warum benutzt du nicht gleich die native API? AVISTREAMINFOW ist in deiner Definition nicht äquivalent zu derjenigen im Link. In C++/CLI ist ref struct dasselbe wie ref class, aber nicht dasselbe wie in C# struct. Du müsstest also AVISTREAMINFOW als value class bzw. value struct definieren.

    Weiterhin hast du alle Attribute in dieser Klasse als statische Felder gebaut, was überhaupt keinen Sinn ergibt. Im C# Beispiel gibt es auch 64 UInt16 Felder für szNamex, aber du hast ein statisches (!) Feld mit einem Zeiger auf 64 Bytes. Wie soll das denn zusammenpassen?

    Wenn es denn sein muss, dann mach es so:

    struct AVISTREAMINFOW {
        DWORD fccType;
        DWORD fccHandler;
        DWORD dwFlags;
        DWORD dwCaps;
        WORD  wPriority;
        WORD  wLanguage;
        DWORD dwScale;
        DWORD dwRate;
        DWORD dwStart;
        DWORD dwLength;
        DWORD dwInitialFrames;
        DWORD dwSuggestedBufferSize;
        DWORD dwQuality;
        DWORD dwSampleSize;
        RECTa  rcFrame;  // ???
        DWORD dwEditCount;
        DWORD dwFormatChangeCount;
        WORD szName[64];
    };
    

    Oder noch viel besser, benutz die native API, oder mach es in C# wie im Beispiel. C++/CLI ist nicht einfach und verlangt dem Programmierer sehr viel ab.



  • Danke für den Hinweis:

    Wenn es denn sein muss, dann mach es so:

    ja es muss, da ich es in einen älteren C++/Cli Code einbauen will/soll, der nur mit sehr großem bis unendlich großem Aufwand nach C# (oder besser gleich für ein anderen Betriebssystem) umgeschrieben werden könnte.
    Deinen Hinweis habe ich schon ausprobiert aber mit demselben Ergebnis (RECTa kann man dann ja auch mit RECT ersetzen)
    Disassembly sagt:

    int hr = AVIFileCreateStream(pfile_, ps_, &strhdr);
    000000fd  lea         eax,[ebp+FFFFFF30h] <- genau hier ist’s abgestürzt
    00000103  push        eax  
    00000104  mov         ecx,dword ptr ds:[00233B24h] 
    0000010a  mov         edx,dword ptr ds:[00233B28h] 
    00000110  call        003D1A00 
    00000115  mov         dword ptr [ebp+FFFFFF20h],eax 
    0000011b  mov         eax,dword ptr [ebp+FFFFFF20h] 
    00000121  mov         dword ptr [ebp+FFFFFF28h],eax
    

    Auf jeden Fall entsteht das Problem durch die Übergabe des Zeigers auf die AVISTREAMINFOW- Struktur.

    -> Der ASM- Experte erkennt bestimmt sofort, was hier das Problem ist.

    oder mach es in C# wie im Beispiel

    …neee lieber nicht, weil wer weiß schon, ob C# in 2 Jahren vielleicht nicht auch auf einmal

    keinen Sinn

    mehr macht und schlimmstenfalls auf einmal durch VB ersetzt wird (dann lieber ein anderes Betriebssystem – da wirkt der Rasen nämlich viel grüner…)



  • So wie es aussieht läuft's hiermit (nur für den Fall das sonst noch jemand mit AVIs in Cli/C++ rumkrampfen muss):

    public ref struct RECTa {
      LONG left;
      LONG top;
      LONG right;
      LONG bottom;
    
    };
    
       //[StructLayout(LayoutKind::Sequential)]
    [StructLayout(LayoutKind::Sequential, Pack=1)]
      public ref struct AVISTREAMINFOW {
    
      DWORD fccType;
      DWORD fccHandler;
      DWORD dwFlags;
      DWORD dwCaps;
      WORD  wPriority;
      WORD  wLanguage;
      DWORD dwScale;
      DWORD dwRate;
      DWORD dwStart;
      DWORD dwLength;
      DWORD dwInitialFrames;
      DWORD dwSuggestedBufferSize;
      DWORD dwQuality;
      DWORD dwSampleSize;
    
      RECTa rcFrame;
      //LONG rect_left;
      //LONG rect_top;       
      //LONG rect_right;
      //LONG rect_bottom;
    
      DWORD dwEditCount;
      DWORD dwFormatChangeCount;
      WORD szName0,  szName1,  szName2,  szName3,  szName4,  szName5,
                         szName6,  szName7,  szName8,  szName9,  szName10, szName11,
                         szName12, szName13, szName14, szName15, szName16, szName17,
                         szName18, szName19, szName20, szName21, szName22, szName23,
                         szName24, szName25, szName26, szName27, szName28, szName29,
                         szName30, szName31, szName32, szName33, szName34, szName35,
                         szName36, szName37, szName38, szName39, szName40, szName41,
                         szName42, szName43, szName44, szName45, szName46, szName47,
                         szName48, szName49, szName50, szName51, szName52, szName53,
                         szName54, szName55, szName56, szName57, szName58, szName59,
                         szName60, szName61, szName62, szName63;
    
      };
    

Anmelden zum Antworten