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