DLL ansprechen?

Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Jan_

Ehemaliger Admin

Betreff: DLL ansprechen?

BeitragDi, Jan 11, 2005 11:50
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hatte erwartet, das das functioniert:
Code: [AUSKLAPPEN]

Extern "alleg40.dll"

Function allegro_init()
Function install_keyboard()
Function set_gfx_mode(card%, w%,h%, v_w%,v_h%)
Function allegro_message(msg$)
Function release_screen()

End Extern

If (allegro_init() <> 0) Then
   RuntimeError "Kann Allegro nicht initialisieren"
EndIf

install_keyboard();

If set_gfx_mode(GFX_AUTODETECT, 320, 200, 0, 0) <> 0) Then
   If set_gfx_mode(GFX_SAFE, 320, 200, 0, 0) <> 0) then
      set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
      allegro_message("Unable to set any graphic mode\n%s\n");
       RuntimeError "Kann keinen Grafikmodus setzten"
   endif
endif

release_screen();

End


Aber es Zeigt mir nur den Stinkefinger :-/
Die Dll ist richtiggeschrieben und im gleichen verzeichniss.
Fehlermeldung: Unrecognized calling convention 'alleg40.dll'
between angels and insects

Abrexxes

BeitragDi, Jan 11, 2005 12:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Willst du etwa Allegro einbinden?

Jan_

Ehemaliger Admin

BeitragDi, Jan 11, 2005 12:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Jap, als test will ich es mal versuchen.
between angels and insects

bruZard

BeitragDi, Jan 11, 2005 12:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Lasse mal ".dll" weg ...
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

Jan_

Ehemaliger Admin

BeitragDi, Jan 11, 2005 13:07
Antworten mit Zitat
Benutzer-Profile anzeigen
geht auch nciht.
between angels and insects

bruZard

BeitragDi, Jan 11, 2005 13:16
Antworten mit Zitat
Benutzer-Profile anzeigen
dann gucke Dir mal den Quelltext unter pub.mod\win32.mod an ...
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

Jan_

Ehemaliger Admin

BeitragDi, Jan 11, 2005 13:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, habe ich, ich will aber die DLL nicht in den System Pfad setzten :-/
Und dort scheint es ja so zu sein.
between angels and insects

bruZard

BeitragDi, Jan 11, 2005 13:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist wirklich eigenartig, aber folgender Code funktioniert:

Code: [AUSKLAPPEN]

Import "meine_schöne_DLL.dll"

Extern
  Function Methode01(parameter)
  Function Methode02(parameter)
End Extern
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image
 

Demon

BeitragDi, Jan 11, 2005 14:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Frage ist, welche Konvention die Funktionen in der dll verwenden (also cdecl, stdcall, safecall, register...).
Dlls in Delphi verwenden standardmäßig stdcall (und in C natürlich cdecl).
Don't drink and derive!
 

Edlothiol

BeitragDi, Jan 11, 2005 15:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Extern "alleg40.dll"

Function allegro_init()
Function install_keyboard()
Function set_gfx_mode(card%, w%,h%, v_w%,v_h%)
Function allegro_message(msg$)
Function release_screen()

End Extern
Sollte das nicht Code: [AUSKLAPPEN]

Import "alleg40.dll"

Extern

Function allegro_init()
Function install_keyboard()
Function set_gfx_mode(card%, w%,h%, v_w%,v_h%)
Function allegro_message(msg$)
Function release_screen()

End Extern
heißen?

Jan_

Ehemaliger Admin

BeitragDi, Jan 11, 2005 15:29
Antworten mit Zitat
Benutzer-Profile anzeigen
@Cdeamon

es ist eine C Dll
between angels and insects
 

Dreamora

BeitragDi, Jan 11, 2005 18:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Import "alleg40.dll"

Extern

Function allegro_init()="xxx"
Function install_keyboard()="xxx"
Function set_gfx_mode(card%, w%,h%, v_w%,v_h%)="xxx"
Function allegro_message(msg$)="xxx"
Function release_screen()="xxx"

End Extern


xxx ist dabei der Name der Funktion wie er in der DLL ist ( kann man über PE explorer, depency viewer und andere programme rausfinden ), so wie ihr es aus Blitz3D userlibs mit :xxx kennt.

ohne das XXX geht das nur mit direktem Sourcecode sowie dem was über die compiler direktiven ( extern "win32", extern "linux", extern "macos" ) bereits bekannt ist.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Jan_

Ehemaliger Admin

BeitragMi, Jan 12, 2005 8:39
Antworten mit Zitat
Benutzer-Profile anzeigen
klingt gut, muss ich heute mal testen.
between angels and insects
 

Nemesis

BeitragMi, Jan 12, 2005 16:07
Antworten mit Zitat
Benutzer-Profile anzeigen
also das müsste auch ohne das xxx gehen Dreamora, dieses zeugs ist ja nur dafür da um Functionen aus externen libs in blitz unter anderem namen als in der lib verfügbar zu machen. (also so eine art alias namen)

Function name_der_function_in_der_dll ( ...)

sollte auch gehen. bei mir tut es das jedenfalls.

Jan_

Ehemaliger Admin

BeitragMi, Jan 12, 2005 16:45
Antworten mit Zitat
Benutzer-Profile anzeigen
hm, gibt es ncoh tools, zum DLL Prozeduren, herausfinden, PE ist ja kosten pflichtig und den anderen habe ich nciht gefunden.
between angels and insects

VirtualDreams

BeitragFr, Jan 21, 2005 1:06
Antworten mit Zitat
Benutzer-Profile anzeigen
gib bei google ein: dependency walker
Das kommt von MS und ist kostenfrei. wurde aber oben schon erwähnt
Zitat: "Ich habe ein Programm geschrieben und das funst nich. Warum nich Question Jetzt warte ich schon über 10 Minuten und es hat immer noch keiner geantwortet. Evil or Very Mad Könnt ihr das nich ?"

regaa

BeitragMi, Feb 02, 2005 17:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm..also bei mir klappt es so net, es kommt die Meldung:

Unrecognized Import file type: user32.dll

wenn ich versuche die user32.dll einzubinden, ob nun relativer oder absolute Pfadangabe.

So schaut der Code aus:

Import "user32.dll"

Extern

Function LoadCursor(filename$):"LoadCursorFromFileA"
Function SetCursor(cursorhandle%):"SetCursor"

End Extern

Hat wer nen Tipp?
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net

Vertex

BeitragMi, Feb 02, 2005 17:47
Antworten mit Zitat
Benutzer-Profile anzeigen
So, mit Suco habe ich gestern folgende Feststellung getroffen:
Wenn man z. B. mit einem MingW Compiler eine DLL erstellt - nennen wir sie mal "Test.dll", wird automatisch auch eine libTest.a angelegt. Diese muss dann in das Lib Verzeichnis von BMax. Ansprechen kann man das ganze so:
Code: [AUSKLAPPEN]
Import "-lTest"
Extern
   Function MyCoolFunction:Int(iX:Int, iY:Int) = "MyCoolFunction@8"
End Extern


Das = "MyCoolFunction@8" ist eigentlich nur dann erforderlich, wenn man mit Alias-Namen arbeiten will(z. B. mit dem Präfix "api" oder "api_"). @8 steht für die Anzahl an Bytes die auf dem Stack gepusht werden. Jeder Parameter ist 4 Byte groß(auch Byte Parameter z. B. oder Strings und Pointer).

Das dyn. Ansteuern von DLLs via API-Funktionn LoadLibraryA, GetProcAddress und FreeLibrary ist nicht möglich. Das liegt daran, dass GetProcAddress einen Funktionspointer auf die enstprechende Funktion in der geladenen DLL zurückgibt. Man kann sich zwar in BMax die Adressen von Funktionen zurückgegeben lassen, aber keine Prototypen damit ansprechen wie es z. B. in C möglich ist. (Das überschreiben der Funktion durch eine andere geht auch nicht, das Windows natürlcih dazwischen funkt)

Generell sieht ein Funktionsaufruf von BMax so aus:
Code: [AUSKLAPPEN]

   push   Parameter3
   push   Parameter2
   push   Parameter1
   call   _bb_Funktionsname


Man müsste also rein theoretisch statts _bb_Funktionsname die Adresse von GetProcAddress einfügen. Da _bb_Funktionsname aber ein festes Label ist, und man keine Pointer aufrufen darf, geht das ganze nicht.

mfg olli
vertex.dreamfall.at | GitHub
 

morszeck

BeitragMi, Feb 02, 2005 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
HMMM... *nerv*

Probiere und probiere mehrere DLL's zum laufen zum bringen. Das ist ja echt beschiss...

Da muss ich halt anders ran an dieser Sache.

Danke für die Nachforschung bzw den TIP !!!!

regaa

BeitragMi, Feb 02, 2005 21:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Also nochmal für die dummen:

Ich hab aus ein paar c# files, eine DLL erstellt. Was NUN? Ist es egal womit man dll's erstellt. In meine Falle ist es vom csharpcompiler v1.1* .

Die Add.cs

Code: [AUSKLAPPEN]

using System;

namespace MyMethods
{
   public class AddClass
   {
      public static long Add(long zahl1, long zahl2)
      {
         return (zahl1+zahl2);
      }
   }
}


Die Multiply.cs
Code: [AUSKLAPPEN]

using System;

namespace MyMethods
{
   public class MultiplyClass
   {
      public static long Multiply(long zahl1, long zahl2)
      {
         return (zahl1*zahl2);
      }
   }
}


Und diese tu ich in ne DLL damit:
csc /target:library /out:MyLibrary.DLL Add.cs Mult.cs

hat auch alles gefunzt, die csharp exe die diese DLL benutzt, scheint auf die Methoden zugreifen zu können , aber wie sag ich das BlitzMax?
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group