AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Wie DVD Transfer mit ShrinkTo5.DLL?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie DVD Transfer mit ShrinkTo5.DLL?

Ein Thema von Garfield · begonnen am 30. Nov 2009 · letzter Beitrag vom 6. Dez 2009
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#1

Wie DVD Transfer mit ShrinkTo5.DLL?

  Alt 30. Nov 2009, 17:00
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:
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.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#2

Re: Wie DVD Transfer mit ShrinkTo5.DLL?

  Alt 1. Dez 2009, 07:53

Ü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.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Wie DVD Transfer mit ShrinkTo5.DLL?

  Alt 1. Dez 2009, 08:05
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
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#4

Re: Wie DVD Transfer mit ShrinkTo5.DLL?

  Alt 1. Dez 2009, 17:56
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
    FNSetCallBack(@FCallBack, pUser); zu stehen, wobei pUser = nil ist, weil ich noch nicht weiß, was ich damit anfangen soll.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Wie DVD Transfer mit ShrinkTo5.DLL?

  Alt 1. Dez 2009, 19:32
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
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#6

Re: Wie DVD Transfer mit ShrinkTo5.DLL?

  Alt 1. Dez 2009, 22:54
Guten Abend,
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 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. 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.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Wie DVD Transfer mit ShrinkTo5.DLL?

  Alt 2. Dez 2009, 08:25
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
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#8

Re: Wie DVD Transfer mit ShrinkTo5.DLL?

  Alt 2. Dez 2009, 17:48
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.

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.
Angehängte Dateien
Dateityp: zip shrinkto5_sc_180.zip (411,6 KB, 6x aufgerufen)
Dateityp: 7z shrinkto5gui_206.7z (461,1 KB, 5x aufgerufen)
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Wie DVD Transfer mit ShrinkTo5.DLL?

  Alt 2. Dez 2009, 20:57
Hallo,

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

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



Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#10

Re: Wie DVD Transfer mit ShrinkTo5.DLL?

  Alt 3. Dez 2009, 02:44
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;
}
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:36 Uhr.
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