Aus eine Adresse die von der DLL kommt einen String auslesen

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

funkheld

Betreff: Aus eine Adresse die von der DLL kommt einen String auslesen

BeitragDi, Aug 16, 2016 18:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, guten Tag.

Eine dll mit BlitzMax aufrufen.
Die dll wurden in Purebasic erstellt.

Diese funktioniert ohne Fehlermeldung , aber es wird nur ein Adresse??? zurückgegeben von BlitzMax.
Wie kann ich bitte aus der Adresse??? den Text rauslesen ?

Danke.

GRuss

Code: [AUSKLAPPEN]

ProcedureDLL.s MyFunction()
   ReturnString$ = "text kommt aus der dll"
   ProcedureReturn ReturnString$
EndProcedure


Dazu das BlitzMaxprogramm:
Code: [AUSKLAPPEN]

Strict

import brl.basic
Import pub.win32
Import brl.timer

Local DllName:String, DllHandle:Int
global text_int:int
global text:string
global text1:string

DllName  = "d:/blitzmax/daten/dll_test2.dll"
DllHandle  = LoadLibraryA(DllName)

Global timer:TTimer = CreateTimer(60)
Graphics 400,400

Global MyFunction()"Win32" = GetProcAddress(DllHandle,"MyFunction") ' Text ausgeben

If DllHandle = 0
   drawtext "Dll konnte nicht geladen werden",10,10
   End
EndIf

text_int=MyFunction() ' text=MyFunction()
drawtext text_int,10,10 ' drawtext text,10,10

While Not AppTerminate()
  WaitTimer(timer)
  Flip 0
Wend
  • Zuletzt bearbeitet von funkheld am Di, Aug 16, 2016 23:01, insgesamt 3-mal bearbeitet

Farbfinsternis

BeitragDi, Aug 16, 2016 18:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Solange Byte-weise einlesen bis eine 0 kommt.
Farbfinsternis.tv
 

funkheld

BeitragDi, Aug 16, 2016 19:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie kann man jetzt in BlitzMax mit Peek diese Adresse Byte für Byte auslesen ?

Danke.
Gruss

Mathias-Kwiatkowski

BeitragDi, Aug 16, 2016 19:52
Antworten mit Zitat
Benutzer-Profile anzeigen
konnte man nich iwi so auf dll zugreifen?

(ich weiß zwar nich wozu man sich eine dll in max macht weil max kann theorie alles ^^ ... man braucht keine dll von pbasic, vorallem könnte ich mir denken das man sie dann nich auslesen kann.)

Code: [AUSKLAPPEN]
?Win32
Extern "os"
Function win32_LoadLibrary:Int(lpFileName$z) = "LoadLibraryA@4"
Function win32_GetProcAddress:Byte Ptr(hModule:Int, lpProcName$z) = "GetProcAddress@8"
End Extern
?

Function SetAlwaysOnTop(win:TGadget, bState:Int = True)
?Win32
   Local hModule:Int = win32_LoadLibrary("user32.dll")
   If hModule = 0 Then
      Return
   EndIf
   Local SetWindowPos:Int(hWnd:Int, hWndInsertAfter:Int, X:Int, Y:Int, cx:Int, cy:Int, uFlags:Int) "os" = win32_GetProcAddress(hModule, "SetWindowPos")
   

   
   Local hwnd% = QueryGadget(win, QUERY_HWND)
   If hwnd <> 0 Then
      If bState
         SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE)
      Else
         SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE)
      EndIf
   EndIf
?   
End Function
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017
 

funkheld

BeitragDi, Aug 16, 2016 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Komisch bei der Freebasic-Dll funktioniert es.

Der Wert 123 wird ausgegeben.

FreeBasic-DLL
Code: [AUSKLAPPEN]

DECLARE FUNCTION AddNumbers ALIAS "AddNumbers" ( _
   BYVAL operand1 AS INTEGER, BYVAL operand2 AS INTEGER ) _
   AS INTEGER

FUNCTION AddNumbers  (BYVAL operand1 AS INTEGER, BYVAL operand2 AS INTEGER ) _
  AS INTEGER EXPORT
  AddNumbers = operand1 + operand2
END FUNCTION


Blitzmaxprogramm:
Code: [AUSKLAPPEN]

Strict

import brl.basic
Import pub.win32
Import brl.timer

Local DllName:String, DllHandle:Int
global z:int,z1:int,z2:int

DllName  = "d:/blitzmax/daten/fb_dll.dll"
DllHandle  = LoadLibraryA(DllName)

Global timer:TTimer = CreateTimer(60)
Graphics 400,400

Global AddNumbers(q:int,a:int)"Win32" = GetProcAddress(DllHandle,"AddNumbers@8") ' Zahl ausgeben

If DllHandle = 0
   drawtext "Dll konnte nicht geladen werden",10,10
   End
EndIf

z=100
z1=23
z2=AddNumbers(z,z1)

drawtext z2,20,20
While Not AppTerminate()
    WaitTimer(timer)
  Flip 0
Wend

Mathias-Kwiatkowski

BeitragDi, Aug 16, 2016 20:29
Antworten mit Zitat
Benutzer-Profile anzeigen
die frage is die wie pbasic die dll compiliert
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

BladeRunner

Moderator

BeitragDi, Aug 16, 2016 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn man Strings zurückgeben will muss man auch Strings im Funktionskopf als Rückgabewert deklarieren.
Wäre mein erster Ansatz.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

funkheld

BeitragDi, Aug 16, 2016 22:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Diese beiden Möglichkeiten gibt es bei Purebasic : ProcedureDLL oder ProcedureCDLL

Beide verhalten sich aber gleich und geben den String nicht aus sondern nur einen Zahlenwert,ob es eine Adresse ist weiß ich nicht.

Gruss

BladeRunner

Moderator

BeitragMi, Aug 17, 2016 6:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Global MyFunction()"Win32" = GetProcAddress(DllHandle,"MyFunction") ' Text ausgeben

Hier definierst Du die Funktion so dass sie einen Integer zurückgibt, da kein Rückgabetyp definiert wird.
Mit:
Code: [AUSKLAPPEN]
Global MyFunction:string()"Win32" = GetProcAddress(DllHandle,"MyFunction") ' Text ausgeben

erklärst Du dass die Funktion einen String zurückgeben soll.
Mangels DLL nicht getestet, aber wäre einen Versuch wert.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

funkheld

BeitragMi, Aug 17, 2016 9:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Info.

Funktinoniert nicht. Kommt ein Fehlermeldung im Speicher...

Es war mal ein Versuch, ist aber nicht Lebenswichtig diese DLL .

Gruss

Mathias-Kwiatkowski

BeitragMi, Aug 17, 2016 11:50
Antworten mit Zitat
Benutzer-Profile anzeigen
nur als grenz info ich würde nie ein programm nutzen was einer privat geschrieben hat und dessen eine dll zufügt!

1. ist es nicht notwendig du kannst alles wirklich alles mit bmax machen
2. man weiß ja nicht was die dll macht
3. compiliert pbasic die dll's sehr komisch
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group