Ok, here's a PureBasic example. This shows how to pass an integer, float, string, bank and type.
Create a file in PB called "pbdemo_dll.pb".
Set the file as a dll: Compiler Options > Executable Format > Shared Dll
Copy & paste this code and put the compiled "pbdemo.dll" in the "userlibs" folder.
Now, you will need to create a "pbdemo.decls" file. Copy & paste the code decls and put this file also in the "userlibs" folder.
Finally, restart Blitz3D and create a new file called "pbdemo_dll.bb". Copy & paste this code and run.
Create a file in PB called "pbdemo_dll.pb".
Set the file as a dll: Compiler Options > Executable Format > Shared Dll
Copy & paste this code and put the compiled "pbdemo.dll" in the "userlibs" folder.
;pbdemo_dll ;returns a long and has 2 long parameters ProcedureDLL.l Maximum( nb1.l,nb2.l ) If nb1>nb2 : result.l=nb1 : Else : result.l=nb2 : EndIf ProcedureReturn result EndProcedure ;returns a float and has 6 float parameters ProcedureDLL.f VecDistance( x1.f,y1.f,z1.f,x2.f,y2.f,z2.f ) dx.f=x1-x2 : dy.f=y1-y2 : dz.f=z1-z2 ProcedureReturn Sqr(dx*dx+dy*dy+dz*dz) EndProcedure ;returns a string and has 2 string parameters ProcedureDLL.s AttachString( string1$,string2$ ) result$=string1$+" "+string2$ ProcedureReturn result$ EndProcedure ;returns a string and has one string parameter ProcedureDLL.s ShuffleString( str$ ) sz.l=Len(str$) Dim buf.b(sz) For k=0 To sz-1 : buf(k)=Asc(Mid(str$,k+1,1)) : Next k For k=0 To sz-1 n.l=Random(sz-1) t.l=buf(k) : buf(k)=buf(n) : buf(n)=t Next k For k=0 To sz-1 : result$=result$+Chr(buf(k)) : Next k ProcedureReturn result$ EndProcedure ;4-bytes structure Structure rgba b.b g.b r.b a.b EndStructure ;has one pointer and one long parameter ProcedureDLL SetBankColor( *myptr.rgba,color.l ) *myptr\b=color & $000000FF *myptr\g=(color & $0000FF00) >> 8 *myptr\r=(color & $00FF0000) >> 16 *myptr\a=(color & $FF000000) >> 24 EndProcedure ;returns a long and has one pointer parameter ProcedureDLL.l GetBankColor( *myptr.rgba ) color.l=*myptr\b & $000000FF color=color+(*myptr\g << 8) & $0000FF00 color=color+(*myptr\r << 16) & $00FF0000 color=color+(*myptr\a << 24) & $FF000000 ProcedureReturn color EndProcedure ;one long and one float structure Structure test a.l b.f EndStructure ;has one pointer, one long and one float parameter ProcedureDLL SetType( *myptr.test,pa.l,pb.f ) *myptr\a=pa *myptr\b=pb EndProcedure ;returns a long and has one pointer parameter ProcedureDLL.l GetTypeA( *myptr.test ) ProcedureReturn *myptr\a EndProcedure ;returns a float and has one pointer parameter ProcedureDLL.f GetTypeB( *myptr.test ) ProcedureReturn *myptr\b EndProcedure
Now, you will need to create a "pbdemo.decls" file. Copy & paste the code decls and put this file also in the "userlibs" folder.
.lib "pbdemo.dll" Maximum%( nb1%,nb2% ):"Maximum" VecDistance#( x1#,y1#,z1#,x2#,y2#,z2# ):"VecDistance" AttachString$( string1$,string2$ ):"AttachString" ShuffleString$( str$ ):"ShuffleString" SetBankColor( myptr*,rgba% ):"SetBankColor" GetBankColor%( myptr* ):"GetBankColor" SetType( myptr*,pa%,pb# ):"SetType" GetTypeA%( myptr* ):"GetTypeA" GetTypeB#( myptr* ):"GetTypeB"
Finally, restart Blitz3D and create a new file called "pbdemo_dll.bb". Copy & paste this code and run.
;pbdemo_dll max = Maximum( 15,30 ) vec# = VecDistance( 0,0,0,1,0,1 ) a$ = AttachString( "PureBasic","Coder" ) s$ = ShuffleString( a$ ) bank = CreateBank(4) SetBankColor( bank,$ABCDEF ) rgba=GetBankColor( bank ) Type testtype Field a,b# End Type test.testtype=New testtype SetType( test,42,12.345 ) ;note: can't pass string fields, causes a MAV test2.testtype=New testtype test2\a=GetTypeA( test ) ;note: can't return a type itself, only fields test2\b#=GetTypeB( test ) Print "max="+max Print "vec#="+vec# Print "a$="+a$ Print "s$="+s$ Print "rgba="+Hex(rgba)+" ("+Hex(PeekInt(bank,0))+")" Print "test\a="+test\a+" test\b#="+test\b# Print "test2\a="+test2\a+" test2\b#="+test2\b# WaitKey End