![]() |
Wie DVD Transfer mit ShrinkTo5.DLL?
Die ShrinkTo5.DLL mit der ShrinkTo5GUI waren mal Open Source und auch früher auf der OpenSourceCD. Da auf
![]() ![]() Die Funktionen scheinen bei beiden DLLs gleich zu sein. Das Auslesen der DVD-Informationen funktioniert jedenfalls genauso. Das Problem liegt nun beim DVD-Transfer (Transcodieren). Ich dachte, dass im Prinzip diese Funktionen ausreichen würden:
Code:
Die Callback-Procedure habe ich nicht übersetzt, weil ich nicht weiß, wie:
type
TFNOpen = function(srcPath: PChar): Integer; stdcall; TFNSetTargetSizeMB = function(targetSize: Integer): Integer; stdcall; TFNTransferPath = function(targetPath, stopFlag: PChar): Integer; stdcall; type TShrinkTo5 = Class private FNOpen : TFNOpen; FNSetTargetSizeMB : TFNSetTargetSizeMB; FNTransferPath : TFNTransferPath;
Code:
Nach dem Öffnen der DVD auf Festplatte und dem Setzen der Zielgröße sollte der Transfer mit diesem Aufruf starten:
void _stdcall SetCallBack(int (_stdcall *pCallBack)(int alert, int param, void *pTransfer, void *pUser), void *pUser)
Delphi-Quellcode:
Es gibt aber bei der DLL v1.7.1 eine Zugriffsverletzung nachdem der Ordner VIDEO_TS sowie die Datei VIDEO_TS.VOB angelegt wurden:
FNTransferPath(PChar(srcPath), PChar('0'));
Zitat:
Zitat:
|
Re: Wie DVD Transfer mit ShrinkTo5.DLL?
:?
Über das Callback kommen zwei Arten von Alarmen herein. Einmal wenn ein neues Vorschaubild zur Verfügung und dann, wenn sich die Datei ändert. Der Absturz kommt, wenn die erste Datei transcodiert werden soll. Könnte also die Ursache in der fehlenden Callback-Routine liegen. |
Re: Wie DVD Transfer mit ShrinkTo5.DLL?
Hallo,
void _stdcall SetCallBack(int (_stdcall *pCallBack)(int alert, int param, void *pTransfer, void *pUser), void *pUser) Lass dich nicht von den vielen * ärgern. int (_stdcall *pCallBack)(int alert, int param, void *pTransfer, void *pUser) Addresse einer int-Funktion. Im Unterschied zu Delphi kann man den kompletten Funktions-Kopf als Parameter schreiben, unter Delphi muss das per type definiert werden. (hast du ja bei den anderen Sachen schon gemacht). Mal so frei getippt. Die Parameter bekommst du bestimmt selber hin
Delphi-Quellcode:
Aufruf per SetCallBack(@CallBack, );
function CallBack(int alert, int param, void *pTransfer, void *pUser): Integer; stdcall;
procedure SetCallBack(int (CallBacl: Pointer; void *pUser); stdcall; Es wird einfach eine Adresse auf eine Funktion übergeben. Noch ein Link zu CallBacks. ![]() Heiko |
Re: Wie DVD Transfer mit ShrinkTo5.DLL?
Hallo Heiko,
vielen Dank für Deine Antwort. Callbacks sind neu für mich. Das Beispiel von Luckie kann ich nachvollziehen, aber bei meinem Problem komme ich nicht viel weiter:
Delphi-Quellcode:
Bevor der Transfer starten soll, habe ich jetzt vorerst
type
... TFNCallBack = function(alert, param: Integer; pTransfer, pUser: Pointer): Integer; stdcall; TFNSetCallBack = procedure(pCallBack, pUser: Pointer); stdcall; ... TShrinkTo5 = Class private ... FCallBack: TFNCallBack; procedure SetCallBack(pCallBack, pUser: Pointer); stdcall; public property CallBack: TFNCallBack write FCallBack; ... end; procedure TShrinkTo5.SetCallBack(pCallBack, pUser: Pointer); var CallbackProc: TFNCallBack; begin @CallBackProc := PCallBack; // FCallBack(CallBackProc.); end;
Delphi-Quellcode:
zu stehen, wobei pUser = nil ist, weil ich noch nicht weiß, was ich damit anfangen soll.
FNSetCallBack(@FCallBack, pUser);
|
Re: Wie DVD Transfer mit ShrinkTo5.DLL?
Hallo,
Delphi-Quellcode:
hm ?
var
CallbackProc: TFNCallBack; begin @CallBackProc := PCallBack; Du musst doch die CalllBack-Prozedure selber noch definieren.
Delphi-Quellcode:
Und jetzt kommt das Gemeine.
function MyCallBack(alert, param: Integer; pTransfer, pUser: Pointer): Integer; stdcall;
begin Beep (0); ;) end; begin SetCallBack(@MyCallBack); Es darf keine Klassen-Methode sein !!! Grund: Klassen-Methoden haben einen unsichtbaren 1. Parameter (das Objekt selbst). Heiko |
Re: Wie DVD Transfer mit ShrinkTo5.DLL?
Guten Abend,
Zitat:
Zitat:
Leider tritt danach immernoch der selbe Fehler in der DLL auf. In der Source der DLL ist eine Liste von Callbacks enthalten. Da ist steht zwar anstelle pUser pUserData drin, dürfte aber keinen Unterschied machen. Leider ist da kein Hinweis, was das sein soll. Muss mir mal die Source der GUI ansehen, vielleicht finde ich dort etwas. |
Re: Wie DVD Transfer mit ShrinkTo5.DLL?
Hallo,
Lesen von Adresse 00000000 Das heisst NIL-Zugriff. Vielleicht muss ja ein gültiger User-Pointer übergeben werden, weil dort etwas durch die DLL reingeschrieben wird. Heiko |
Re: Wie DVD Transfer mit ShrinkTo5.DLL?
Liste der Anhänge anzeigen (Anzahl: 2)
Was den Callback angeht, findet sich in der DoShrink.h
Code:
und in der DoShrink.cpp
virtual int CallBack(int alert, int param, void *pTransfer);
Code:
Zu den pUser/pUserData finde ich nichts. :wall:
// derived callback routine
int UserTransferAlert::CallBack(int alert, int param, void *pTransfer) { switch(alert) { case ALERT_PREVIEW_AVAIL: HBITMAP hprevBitmap; hprevBitmap = bmpStatic->SetBitmap((HBITMAP)param); DeleteObject(hprevBitmap); return 1; // we keep the current hbitmap default: return -1; } } Jetzt bekomme ich nach dem Start des Transfer die Zugriffsverletzung:
Code:
und anschließend
---------------------------
Anwendungsfehler --------------------------- Exception EAccessViolation in Modul ShrinkTo5.dll bei 0000D23D. Zugriffsverletzung bei Adresse 1000D23D in Modul 'ShrinkTo5.dll'. Lesen von Adresse 00000030. --------------------------- OK ---------------------------
Code:
Das ist unabhängig davon, ob das Callback gesetzt ist oder nicht.
---------------------------
Anwendungsfehler --------------------------- Exception EOSError in Modul ShrinkGUI.exe bei 0000DEBD. Systemfehler. Code: 5. Zugriff verweigert. --------------------------- OK --------------------------- Ich hänge mal mein Projekt und den ShrinkTo5 Source an. Vielleicht hat jemand Lust, drüber zu sehen. |
Re: Wie DVD Transfer mit ShrinkTo5.DLL?
Hallo,
Zitat:
Was hast du denn bei PUser (pXXXX) jetzt angegeben. Heiko |
Re: Wie DVD Transfer mit ShrinkTo5.DLL?
Ich habe pUser nur als Pointer deklariert und nil zugewiesen. Jetzt überlege ich, ob da eventuell der Pointer zu der Procedure hingehört, von welcher ich ein Callback möchte.
Was ich nicht verstehe: Transfer.h:
Code:
TransferAlert.cpp
// *** for alert receivers
// for C++ Languages: defines a CallBack to be overriden virtual int CallBack(int alert, int param, void *pTransfer); // defines the callback routine to be called when an alert is available // this function must be overwritten by a derived class // the last parameter can be reinterpreted (explicit cast) to (Transfer *) // for non C++ Languages: sets a pointer to a callback function // when calling the CallBack the pTransfer parameter points to Transfer Object and pUser to the user supplied data to this function virtual void SetCallBack(int (_stdcall *pCallBack)(int alert, int param, void *pTransfer, void *pUser), void *pUser);
Code:
// for non C++ Languages: sets a pointer to a callback function
void TransferAlert::SetCallBack(int (_stdcall *pCallBack)(int alert, int param, void *pTransfer, void *pUser), void *pUser) { this->pCallBack = pCallBack; this->pUser = pUser; } |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz