UnderwareDESIGN

PlayBASIC => Beginners => Topic started by: Fluorescent on August 25, 2005, 03:01:10 AM

Title: Basic DLLing?
Post by: Fluorescent on August 25, 2005, 03:01:10 AM
I was thinking about writing a DLL-file for some stuff I want to experiment with. But I wonder if I have to register the DLL for play basic to find it, or is it enough to put it in the same folder as the exe ??
Title: Basic DLLing?
Post by: empty on August 25, 2005, 03:45:18 AM
In case it is a standard DLL you could just place it in the exe folder. However, ActiveX/COM DLLs (the ones VB produces) are currently not supported.
Title: Basic DLLing?
Post by: Fluorescent on August 25, 2005, 09:36:45 AM
Hmmm... I've created a MFC-Dll, used the wizard in Visual Studio 2003. But Playbasic claims that the DLL doesn't exist. Might there be something wrong with my dll or my pb-code ??

[pbcode]
PB_DLL = GETFREEDLL()

IF GETDLLEXIST("PB_DLLTest.dll") <> 1
   PRINT "DLL Doesn't exist"
   SYNC
   WAITKEY
   END
ENDIF

LOADDLL "PB_DLLTest.dll", PB_DLL

IF GETDLLCALLEXIST(PB_DLL, "Message") <> 1
   PRINT "Can't find function"
   SYNC
   WAITKEY
   END
ENDIF

PRINT "Messagebox"
CALLDLL(PB_DLL, "Message", 0)
SYNC
WAITKEY : WAITNOKEY
SYNC

DELETEDLL PB_DLL
[/pbcode]

Title: Basic DLLing?
Post by: kevin on August 25, 2005, 10:45:06 AM
It's your usage of the GetDLLExist command.  As this function returns if this dll has been loaded into memory, not does it exist on disc.  

See-> [plink] GetDllExist always returns 0 (http://www.underwaredesign.com/forums/index.php?topic=719.0)[/plink]


Title: Basic DLLing?
Post by: Fluorescent on August 25, 2005, 01:50:50 PM
AHA!
Then I think it might be a small error in the documentation that I have. Because the if-statement for GetDllExist is before  LoadDll.
Title: Basic DLLing?
Post by: kevin on August 25, 2005, 01:59:13 PM
Nah, that's correct.  As it's checking to see if this DLL has been loaded previously (which it can't have been in the example)!.   so if it hasn't, you load it, if it has, you don't.. it's already in memory.
Title: Basic DLLing?
Post by: kevin on August 25, 2005, 02:00:27 PM
actually make sure your using PB1.088 ?
Title: Basic DLLing?
Post by: Fluorescent on August 25, 2005, 04:37:34 PM
Hmm I got it working. Although I'm using PB 1.08.

Can I pass Types to and from my DLL functions ??
Title: Basic DLLing?
Post by: empty on August 25, 2005, 05:08:26 PM
QuoteHmm I got it working. Although I'm using PB 1.08.
The GETDLLEXIST works a bit different in 1.08.
While 1.08 returns 1 if a DLL has been loaded (or 0 if it hasn't), 1.088 PB returns the actual index number

QuoteCan I pass Types to and from my DLL functions ??
You can pass types to DLLs. They are passed as memory pointers.
Title: Basic DLLing?
Post by: Fluorescent on August 25, 2005, 05:27:02 PM
You dont' happen to have a neat example of passing a type to C++ ?? Passing single variables of int, float and string was no problem. But I want to be able to pass a Type with a mixture of variable types. I tried to create mytype in Play Basic
TYPE mytype
a
b#
c$
ENDTYPE


and in C++ I created a struct
struct mytype {
int a;
float b;
char *c;
};

But it didn't work. To my supprise it didn't crash either :-)
Title: Basic DLLing?
Post by: empty on August 26, 2005, 04:26:20 AM
Make sure that in C++ the exported function takes the parameter like this:

void aTestFunction(mytype &thistype)
Title: Basic DLLing?
Post by: Fluorescent on August 26, 2005, 03:22:16 PM
Am I on the right track trying to use structs when passing Types to and from Play Basic and C++ DLL ??

When I use the &-operand on the parameter the program crashes. If I remove the &, the program runs and the string variable c$ that I've set to "MARTIN" becomes MZ and some sort of square that I can't reproduce.

I admit to not being the world's greatest Cpluspluser, particulary when it comes to having the C++ code interact with code from other languages.
Title: Basic DLLing?
Post by: empty on August 26, 2005, 05:29:10 PM
QuoteI admit to not being the world's greatest Cpluspluser
Neither am I (being an old (object) pascal desciple and all ;) )

However, this works for me:
PlayBasic code
[pbcode]
Type TMyType
 a, b#, c$
EndType

Dim myType as TMyType

myType.a = 42
myType.b# = 1.234
myType.c$ = "Hello"

LoadDll "test.dll", 1
CallDll 1, "testfunc", myType.TMyType
DeleteDll 1
[/pbcode]

C++ code

struct TType {
 int a;
 float b;
 char *c;
};

BOOL APIENTRY DllMain( HANDLE hModule,
                      DWORD  ul_reason_for_call,
                      LPVOID lpReserved
     )
{
  return TRUE;
}



void _stdcall testfunc(TType &myType) {
  int myInt = myType.a;
  float myFloat = myType.b;
  char *myChar = myType.c;

  char buffer[20];
  itoa(myInt, buffer, 10);
  MessageBox(0, buffer, "Test", 0);
  gcvt(myFloat,4,buffer);
  MessageBox(0, buffer, "Test", 0);
  MessageBox(0, myChar, "Test", 0);
}
Title: Basic DLLing?
Post by: Fluorescent on August 27, 2005, 01:33:55 PM
Dude! you make it look so easy ;-)

I didn't use the myType.TMyType in the function call!!