Author Topic: load a pbwin dll with freebasic :)  (Read 7822 times)

0 Members and 1 Guest are viewing this topic.

Offline Frank Brübach

  • Full Member
  • ***
  • Posts: 109
  • User-Rate: +13/-5
  • Gender: Male
load a pbwin dll with freebasic :)
« on: September 25, 2012, 01:10:58 PM »
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..

Code: [Select]
'
' 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

Offline Peter Weis

  • Sr. Member
  • ****
  • Posts: 326
  • User-Rate: +15/-4
  • Gender: Male
Re: load a pbwin dll with freebasic :)
« Reply #1 on: September 25, 2012, 03:47:30 PM »
Hallo Frank,

So geht es

Code: [Select]
'
' 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
« Last Edit: September 25, 2012, 05:47:08 PM by Peter Weis »

Offline Frank Brübach

  • Full Member
  • ***
  • Posts: 109
  • User-Rate: +13/-5
  • Gender: Male
Re: load a pbwin dll with freebasic :)
« Reply #2 on: September 25, 2012, 06:21:09 PM »
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

Offline Peter Weis

  • Sr. Member
  • ****
  • Posts: 326
  • User-Rate: +15/-4
  • Gender: Male
Re: load a pbwin dll with freebasic :)
« Reply #3 on: September 25, 2012, 07:27:40 PM »
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
« Last Edit: September 25, 2012, 07:57:50 PM by Peter Weis »

Offline Frank Brübach

  • Full Member
  • ***
  • Posts: 109
  • User-Rate: +13/-5
  • Gender: Male
Re: load a pbwin dll with freebasic :)
« Reply #4 on: September 26, 2012, 05:28:46 PM »
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

Offline Peter Weis

  • Sr. Member
  • ****
  • Posts: 326
  • User-Rate: +15/-4
  • Gender: Male
Re: load a pbwin dll with freebasic :)
« Reply #5 on: September 26, 2012, 06:59:38 PM »
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 :)
« Last Edit: September 26, 2012, 07:09:07 PM by Peter Weis »