DirectsShow-RenderFile und dynamische Filezuordnung

Strizzi

Grünschnabel
Hallo!

Bin blutiger Anfänger in der C++ Programmierung; also falls das eine wirklich bescheuerte Frage ist, mir zu verzeihen!

Es geht um folgendes:
DirectShow bietet folgende Methode an um ein File zu rendern:
hr = pGraph->RenderFile((LPCWSTR)temp, NULL);

Es geht um die variable "temp"
Hier wird der pfad der zu rendernden datei angegeben. mach ich es folgenderweise:
RenderFile(L"C:\\beispiel.avi", NULL) funktioniert alles.

ich habe nun eine klasse die einen ordner ausliest und dann die filepfade in einem vektor abspeichert - das funktioniert, ABER: die pfade haben das format:
C:\beispiel.avi also ohne doppeltem "\"
die klasse bietet ebenfalls eine funktion, die einen zufälligen pfad als string-objekt liefert:
string temp = klasse.getRndFilePath();

RenderFile will aber kein string-objekte deshalb wandel ich diesen string in ein char-Array char temp[] um. Das Umwandeln funktioniert und der Pfad steh dann im array.
das gibt zwar keinen fehler, aber auch kein gerendertes file!

liegt es an den fehlenden doppelten \\ im pfad?
was macht das L bzw. LPCWSTR vor dem string im renderFile?

Ich wäre sehr über eure Hilfe erfreut!
 
Das L ist ein Makro, dass den nachfolgenden Text beim Kompilieren in Unicode umwandelt.

RenderFile erwartet den Dateinamen als Unicode-String. Ich vermute, dass deine Klasse den FileNamen jedoch als ASCII-String übergibt. Da das L-Makro nur direkt übersetzt werden kann, musst du deinen String per Hand in Unicode umwandeln.

Hier einfach ein Schnipsel, weil die zuständige Routine dämlich aufzurufen ist:

Code:
WCHAR     wFileName[MAX_PATH];

MultiByteToWideChar( CP_ACP, 0, szFileName, -1, wFileName, MAX_PATH );

Den wFileName kannst du dann an RenderFile übergeben, szFileName ist einfach ein normales char-Array (oder vom std::string mit .c_str() ).
 
ok, danke erstmal!

das hab ich schon probiert und hat leider auch nicht geklappt.
ich hab meinen string per schleife in ein char - array geschrieben und das anschließend mit MultiByteToWideChar umgewandelt - hat auch nicht geklappt, leider.

RenderFile akzeptiert aber bei mir auch das char arrey, welches ich per schleife erzeugt hab.

Visual Studio 6 compiliert auch ohne fehler, nur eben kommt es zu keiner ausgabe des files.
liegt es vielleciht doch daran, dass er die zeichen ("\") im pfad falsch interpretiert?

noch eine andere frage: was genau macht c_str()?

danke
 
c_str ist ein Member vom std::string. Das gibt einfach ein const char* auf einen Buffer zurück, den man für dementsprechende Funktionen verwenden kann.

Wenn das mit dem Umwandeln noch nicht reicht, würde ich evtl. doch mal versuchen, die einfachen Backslashes durch doppelte zu ersetzen (noch im Ascii-String). Würde mich zwar wundern, andererseits aber auch nicht (Häh?)
 
War folgendes Problem:

Hab folgenden Code hinzugefügt um mir die Fehlermedlung anzusehen:
Code:
if (FAILED(hr))
		{
			printf("ERROR");
			TCHAR szErr[MAX_ERROR_TEXT_LEN];
			DWORD res = AMGetErrorText(hr, szErr, MAX_ERROR_TEXT_LEN);
			cout <<"\n" << szErr <<"\n";
			return hr;
		}

Dabie hat sich doch glatt herausgestellt, dass er keinen Filtergraphen für *.mov Files erstellen kann.
Obwohl es in GraphEdit (mitgeliefertes DirectX Tool zur Überprüfung) funktioniert.

ab sofort immer eine Ausgabe ob es funktioniert oder nicht wenn möglich!

Danke aber für eure Hilfe!
 
Uhje, Apfel Schnellzeit. Das ist denke ich bei DirectShow auch nicht generell dabei. Du müsstest wahrscheinlich beim Redistributen einen Codec oder die QuickTime-Installation mitliefern.

Wenn es in GraphEdit funktioniert, müsste es eigentlich auch im eigenen Programm laufen. Evtl. klappt die Codec-Selbsterkennung nicht so gut. Musstest du in GraphEdit selbst Hand anlegen, damit es funktioniert?
 
Zurück