Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 21:01

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Zeichenroutine in DLL auslagern
BeitragVerfasst: Di Okt 31, 2006 17:35 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
Hi,

ich plane momentan eine Sound-Visualisierungsengine zu schreiben. Dabei soll der Entwickler einfach eine Komponente, die das OpenGL-Grundgerüst beinhaltet, einfach bei sich raufziehen können und die Komponente kümmert sich dann um die DLL (anbinden etc.). Aber irgendwie mag OpenGL es nicht, wenn ich die Zeichenroutinen außerhalb habe. Gibt es eine Möglichkeit, dass man die OpenGL-Verarbeitung doch außerhalb macht?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 31, 2006 18:26 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Was hat er denn für Problem? Wie äußert es sich? Willst du nur die Zeichenroutine auslagern oder auch die Initialisierung?

Aber ich denke mal das Problem dürften die Pointer von OpenGL sein. Also die werden bei der dglOpenGL dynamisch geladen und einer DLL müsstest du diese noch einmal per Hand laden oder von außen setzen. Aber bei grob geschätzt 300 Methoden dürftest du da keinen Spaß bei haben. Aber das kommt wiederrum darauf an was du vor hast. Was mich wieder zu meinen ersten Fragen bringt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 31, 2006 18:36 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
Ich glaube, wenn ich dir den Source zeige, weißt du wie ich es vorhatte/vorhabe:

Code:
  1. library VisulDemo;
  2.  
  3. uses
  4.   dglOpenGl;
  5.  
  6. procedure DrawData(var SpectrumArray: Single; SpectrumSize: Cardinal);
  7. begin
  8.   glBegin(GL_QUADS);
  9.     glVertex2f(  0,   0);
  10.     glVertex2f(  0, 0.1);
  11.     glVertex2f(0.1, 0.1);
  12.     glVertex2f(0.1,   0);
  13.   glEnd;
  14. end;
  15.  
  16. exports
  17.   DrawData;
  18.  
  19. begin
  20.  
  21. end.


Code:
  1. unit SBVisualizationEngine;
  2.  
  3. interface
  4.   uses
  5.     Windows, SBComponents;
  6.  
  7.   type
  8.     TDrawData = procedure (var SpectrumArray: Single; SpectrumSize: Cardinal);
  9.  
  10.   type
  11.     TSBSoundVisualization = class(TSBControl)
  12.     private
  13.       FLibHandle: THandle;
  14.  
  15.       DrawData: TDrawData;
  16.  
  17.     protected
  18.       procedure PaintControl; override;
  19.  
  20.     public
  21.       destructor Destroy; override;
  22.       function SetLibraryName(Value: WideString): Boolean;
  23.     end;
  24.  
  25. implementation
  26.  
  27. ////////////////////////////////////////////////////////////////////////////////
  28. //--TSBSoundVisualization--                                                   //
  29. ////////////////////////////////////////////////////////////////////////////////
  30.  
  31. {******************************************************************************}
  32. {* Published methods                                                             *}
  33. {******************************************************************************}
  34.  
  35. procedure TSBSoundVisualization.PaintControl;
  36. var
  37.   a: array of Single;
  38. begin
  39.   SetLength(a, 1);
  40.   if FLibHandle>0 then
  41.   begin
  42.     DrawData(a[0], 0);
  43.   end;
  44. end;
  45.  
  46. {******************************************************************************}
  47. {* Public methods                                                             *}
  48. {******************************************************************************}
  49.  
  50. destructor TSBSoundVisualization.Destroy;
  51. begin
  52.   inherited;
  53.   if FLibHandle>0 then FreeLibrary(FLibHandle);
  54.   FLibHandle:=0;
  55. end;
  56.  
  57. {------------------------------------------------------------------------------}
  58.  
  59. function TSBSoundVisualization.SetLibraryName(Value: WideString): Boolean;
  60. begin
  61.   Result:=false;
  62.   FLibHandle:=LoadLibraryW(PWideChar(Value));
  63.   if FLibHandle>0 then
  64.   begin
  65.     DrawData:=GetProcAddress(FLibHandle, PAnsiChar('DrawData'));
  66.     if @DrawData<>nil then
  67.     begin
  68.       Result:=true;
  69.  
  70.     end;
  71.     if not Result then
  72.     begin
  73.       FreeLibrary(FLibHandle);
  74.       FLibHandle:=0;
  75.     end;
  76.   end;  
  77. end;
  78.  
  79. end.


Fehlermeldung:
Zitat:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 00000000. Lesen von Adresse 00000000' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------

Die Fehlermeldung hilft einem also nicht ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 31, 2006 18:40 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Das ist eindeutig das Problem mit den Zeigern. OpenGL muss auch in der DLL initialisiert werden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 31, 2006 19:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Lager am besten alles in die DLL aus, was OpenGL betrifft, dann funzt das wunderbar. So mache ich das in einem C++ Projekt auch und das klappt einwandfrei.
Ne Init-Funktion, welche ein Handle auf das Fenster bekommt und damit "startest" dann dein OpenGL-Zeugs. Entsprechend muss natürlich auch ein Deinit her.
Oder alle Instanzen mitloggen und beim ENtladen der DLL entsprechend abfangen udn die Ressourcen freigeben.

Mal noch ne Frage zu der Fehlermeldung: hat da wer Infos/ne Seite, wo Fehlerquellen für diese sehr unpräzise Fehlermeldung stehen?
Weil bei meinem Prob(anderer Thread, das mit dem Select), kommt manchmal diesselbe Meldung.

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 01, 2006 11:14 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich würde die visualisierung garnicht in der dll machen.
Gib die benötigten daten raus und lass den user über die funktionen in deinem Header, die Daten zeichnen.
Damit hast du den Vorteil, du kannst es auch für D3D oder andere zeichen libs nutzen.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 02, 2006 00:06 
Offline
DGL Member

Registriert: Sa Okt 22, 2005 20:24
Beiträge: 291
Wohnort: Frauenfeld/CH
also 00000000 heisst eigentlich immer das er auf etwas zugreifen will, was nicht existiert. Beim rest kann ich allerdings auch nicht weiterhelfen.

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 02, 2006 14:32 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Gaukler hat geschrieben:
also 00000000 heisst eigentlich immer das er auf etwas zugreifen will, was nicht existiert. Beim rest kann ich allerdings auch nicht weiterhelfen.

Es steht doch schon alles oben:
Die dglOpenGL.pas hat alle Funktionen als Pointer, sodass man ohne Probleme für die entsprechenden Versionen nur die entsprechenden Funktionen laden kann.
Nicht unterstützte Funktionen sind somit als nil initialisiert.
Das Problem bei der DLL ist, dass die Funktionen aus der dglOpenGL.pas nicht in der DLL sondern nur im Programm initialisiert sind, sodass die Exception mit der Adresse 00000000 zutritt.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 02, 2006 15:32 
Offline
DGL Member

Registriert: Sa Okt 22, 2005 20:24
Beiträge: 291
Wohnort: Frauenfeld/CH
Pellaeon hat geschrieben:
Mal noch ne Frage zu der Fehlermeldung: hat da wer Infos/ne Seite, wo Fehlerquellen für diese sehr unpräzise Fehlermeldung stehen?


Ich meinte das ganze eigentlich mehr bezogen auf das, der lösungsansatz war mir eigentlich schon klar....

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]