Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Wie DVD Transfer mit ShrinkTo5.DLL? (https://www.delphipraxis.net/144118-wie-dvd-transfer-mit-shrinkto5-dll.html)

Garfield 30. Nov 2009 16:00


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 AfterDawn ShrinkTo5 v2.0.4 Basic als Binary und Source angeboten wird, wollte ich die GUI nachbauen. Am Datum der Source erkennt man, dass der Source nicht von der v2.0.4 sondern vermutlich von der v1.7.1 stammt. Die Binaries der v1.7.1 bekommt man auf Download3000.

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:
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;
Die Callback-Procedure habe ich nicht übersetzt, weil ich nicht weiß, wie:
Code:
void _stdcall SetCallBack(int (_stdcall *pCallBack)(int alert, int param, void *pTransfer, void *pUser), void *pUser)
Nach dem Öffnen der DVD auf Festplatte und dem Setzen der Zielgröße sollte der Transfer mit diesem Aufruf starten:
Delphi-Quellcode:
FNTransferPath(PChar(srcPath), PChar('0'));
Es gibt aber bei der DLL v1.7.1 eine Zugriffsverletzung nachdem der Ordner VIDEO_TS sowie die Datei VIDEO_TS.VOB angelegt wurden:
Zitat:

---------------------------
ShrinkTo5GUI
---------------------------
Zugriffsverletzung bei Adresse 1000853C in Modul 'ShrinkTo5.dll'. Lesen von Adresse 00000000.
---------------------------
OK
---------------------------
Bei der von v2.0.4 gibt es eine ShowMessage, dass die Software keine Erlaubnis für diese Funktion hätte:
Zitat:

---------------------------
Copyright Violation
---------------------------
This software uses ShrinkTo5 without permission!
---------------------------
OK
---------------------------
Hat hier jemand Erfahrungen mit der ShrinkTo5.DLL und kann mir Hinweise geben, worauf ich noch achten muss? Bei Bedarf kann ich auch mein Projekt anhängen.

Garfield 1. Dez 2009 06:53

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.

hoika 1. Dez 2009 07:05

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:
function CallBack(int alert, int param, void *pTransfer, void *pUser): Integer; stdcall;

procedure SetCallBack(int (CallBacl: Pointer; void *pUser); stdcall;
Aufruf per SetCallBack(@CallBack, );


Es wird einfach eine Adresse auf eine Funktion übergeben.

Noch ein Link zu CallBacks.
1


Heiko

Garfield 1. Dez 2009 16:56

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:
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;
Bevor der Transfer starten soll, habe ich jetzt vorerst
Delphi-Quellcode:
    FNSetCallBack(@FCallBack, pUser);
zu stehen, wobei pUser = nil ist, weil ich noch nicht weiß, was ich damit anfangen soll.

hoika 1. Dez 2009 18:32

Re: Wie DVD Transfer mit ShrinkTo5.DLL?
 
Hallo,

Delphi-Quellcode:
var
  CallbackProc: TFNCallBack;
begin
  @CallBackProc := PCallBack;
hm ?

Du musst doch die CalllBack-Prozedure selber noch definieren.


Delphi-Quellcode:
function MyCallBack(alert, param: Integer; pTransfer, pUser: Pointer): Integer; stdcall;
begin
  Beep (0); ;)
end;

begin
  SetCallBack(@MyCallBack);
Und jetzt kommt das Gemeine.
Es darf keine Klassen-Methode sein !!!

Grund: Klassen-Methoden haben einen unsichtbaren 1. Parameter (das Objekt selbst).


Heiko

Garfield 1. Dez 2009 21:54

Re: Wie DVD Transfer mit ShrinkTo5.DLL?
 
Guten Abend,
Zitat:

Zitat von hoika
Delphi-Quellcode:
var
  CallbackProc: TFNCallBack;
begin
  @CallBackProc := PCallBack;
hm ?

In dem Thread aus Deinem Link hatte Luckie in #28 ein Beispiel, da war das drin. Dürfte hier aber unsinnig sein.

Zitat:

Zitat von hoika
Und jetzt kommt das Gemeine.
Es darf keine Klassen-Methode sein !!!

Grund: Klassen-Methoden haben einen unsichtbaren 1. Parameter (das Objekt selbst).

Das habe ich gemerkt. :evil: Hat ungefähr eine Stunde gedauert bis ich es richtig hatte. Die Procedure ist aber noch leer.

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.

hoika 2. Dez 2009 07:25

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

Garfield 2. Dez 2009 16:48

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:
virtual int CallBack(int alert, int param, void *pTransfer);
und in der DoShrink.cpp
Code:
// 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;
   }
}
Zu den pUser/pUserData finde ich nichts. :wall:

Jetzt bekomme ich nach dem Start des Transfer die Zugriffsverletzung:
Code:
---------------------------
Anwendungsfehler
---------------------------
Exception EAccessViolation in Modul ShrinkTo5.dll bei 0000D23D.

Zugriffsverletzung bei Adresse 1000D23D in Modul 'ShrinkTo5.dll'. Lesen von Adresse 00000030.


---------------------------
OK  
---------------------------
und anschließend
Code:
---------------------------
Anwendungsfehler
---------------------------
Exception EOSError in Modul ShrinkGUI.exe bei 0000DEBD.

Systemfehler. Code: 5.

Zugriff verweigert.


---------------------------
OK  
---------------------------
Das ist unabhängig davon, ob das Callback gesetzt ist oder nicht.

Ich hänge mal mein Projekt und den ShrinkTo5 Source an. Vielleicht hat jemand Lust, drüber zu sehen.

hoika 2. Dez 2009 19:57

Re: Wie DVD Transfer mit ShrinkTo5.DLL?
 
Hallo,

Zitat:

Lesen von Adresse 00000030.
Das ist immer noch ein NIL-Zugriff.

Was hast du denn bei PUser (pXXXX) jetzt angegeben.



Heiko

Garfield 3. Dez 2009 01:44

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:
// *** 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);
TransferAlert.cpp
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 10:35 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz