• Welcome to Jose's Read Only Forum 2023.
 

load a pbwin dll with freebasic :)

Started by Frank Brübach, September 25, 2012, 01:10:58 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Frank Brübach

freebasic / powerbasic topic:

perhaps somebody can help or give a hint: I've tried last day to import a powerbasic dll (pbwin: simple "myDll.dll" ) with "freebasic". but I cannot load the function (MyFunction1). I suppose that freebasic cannot load a win32 dll created by pbwin10..

'
' FREEBAISC EXAMPLE :
'

#Include Once "windows.bi"
#INCLUDE ONCE "win/ole2.bi"
'#INCLUDE ONCE "mydll.bi"

'--------------------------------------------------------------------
' "MyDLL.DLL": created with Powerbasic PBWIN 10 DLL
'--------------------------------------------------------------------
'
Declare FUNCTION MyFunction1 LIB "MyDLL.DLL" _
          Alias "MyFunction1" (BYVAL Param1 AS LONG) AS LONG
'--------------------------------------------------------------------

Dim library AS Any Ptr
Dim lparam As long
Dim As Long lRes, x, y

library = DYLIBLOAD( "MyDLL.DLL" ) ' ok, that's no problem
If( library = 0 ) THEN
  PRINT "Cannot load the mydll dynamic library, ";
  PRINT "aborting program..."
  END 1
END If

'lparam = DYLIBSYMBOL( library, "MyFunction1" )
'If( lparam = 0 ) THEN
'  PRINT "Cannot get AddNumbers function address ";
'  PRINT "from mydll library, aborting program..."
'  END 1
'End IF

'--------------------------- problem ----------------- //
lRes = MyFunction1(lRes) 
    Print "Exe result from MYDLL.DLL:" + STR$(lRes)
'--------------------------- problem ----------------- //

Randomize TIMER
x = RND * 10
Print x; " ="; myFunction1( x)

DYLIBFREE library
Sleep

' notice: I suppose that I can not load a win32 dll file with freebasic
' freebasic error message says:
' C:\Programme\FreeBASIC\bin\win32\ld.exe: cannot find -lMyDLL.DLL
' cannot find


any help is welcome here, thanks in advance. I don't know where to place this question so I did it here. all data you find in zip folder.

best regards, frank

Peter Weis

#1
Hallo Frank,

So geht es


'
' FREEBAISC EXAMPLE :
'

#Include Once "windows.bi"
#INCLUDE ONCE "win/ole2.bi"
'#INCLUDE ONCE "mydll.bi"

'--------------------------------------------------------------------
' "MyDLL.DLL": created with Powerbasic PBWIN 10 DLL
'--------------------------------------------------------------------
'
Extern "windows-ms"
Declare FUNCTION MyFunction1 LIB "MyDLL" _
          Alias "MyFunction1" (BYVAL Param1 AS LONG) AS Long
End Extern         
'--------------------------------------------------------------------

Dim library AS Any Ptr
Dim lparam As long
Dim As Long lRes, x, y



'--------------------------- problem ----------------- //
lRes = MyFunction1(lRes) 
    Print "Exe result from MYDLL.DLL:" + STR$(lRes)
'--------------------------- problem ----------------- //

Randomize TIMER
x = RND * 10
Print x; " ="; myFunction1( x)

Sleep


'EXTERN "Mangling"' startet einen Block, innerhalb dessen alle Deklarationen andere interne Bezeichner erhalten, als sie von FreeBASIC bekommen würden. Dies hat für den Programmfluss keine direkten Auswirkungen. Bei der Rückgabe von Fehlermeldungen oder beim Debuggen mittels externer Programme kann dies allerdings von Vorteil sein.


•EXTERN "C": setzt alle Prozeduren auf CDECL und erhält die Groß-/Kleinschreibung von allen Namen. Dasselbe Verhalten erreicht man ohne EXTERN durch die Aufrufkonvention CDECL zusammen mit einem ALIAS-String, der exakt denselben Prozedurnamen enthält.
•EXTERN "C++": wie EXTERN "C", stellt die Namen zusätzlich aber auf die Konventionen von g++-4.x
•EXTERN "Windows": setzt alle Prozeduren auf STDCALL, erhält die Groß-/Kleinschreibung von allen Namen und setzt zusätzlich das Suffix "@N" an alle Prozedurnamen, wobei N die Größe aller Parameter der jeweiligen Prozedur in Bytes ist.
•EXTERN "Windows-MS": wie EXTERN "Windows", nur dass das Suffix unter DOS/Windows nicht angehängt wird.


Grüße Peter

Frank Brübach

vielen Dank Peter, werd's ausprobieren :-) hatte zwar "extern c" auch mal gelesen, wäre aber nie auf die Idee gekommen, das auch hier zu benutzen :)
thanks peter I will try it, good idea !
kind regards, frank

Peter Weis

#3
Hallo Frank,

nicht extern "C" nehmen sonder extern "windows-ms"

extern "c" nur bei CDECL

Do not take extern "C" but extern "Windows-ms"

extern "c" only at CDECL

Grüße Peter

Frank Brübach

ok, I've got it and my example is now running fine, there was a typo problem in my last sentence in my last post :)

another question: if there are for example twenty functions in my pbwin dll it's necessary to bind every function with this
extern "windows-ms" / end extern ? or it's possible to make before first function this statement "windows-ms" and closing after last function with end extern ?

in some examples there are at beginning of code examples #define statements too (for example: #define freebasic... or whatever else..) do you have any infos about that one too?

thanks in advance, regards, frank

Peter Weis

#5
Hallo Frank,

Extern "windows-ms" vor der ersten Deklaration und END EXTERN nach der letzten Dekleration. Schau dir die Wapper von Winlift an

Wen du Funktion mit Variabler Parameterliste hast also CDECL. Mußt du zwei Blöcke machen einen mit Extern "Windows-ms" und einen Extern "C"

#Define ist so was wie ein Macro in Powerbasic kommt aus der Programmiersprache C

schau mal hier nach da steht alles

http://www.freebasic-portal.de/befehlsreferenz/

Grüße Peter :)