C++ DLL für Blitzbasic
-
Hi,
Ich programmiere mit blitzbasic spiele,da diese sprache von ihren möglichkeiten her etwas beschränkt ist möchte ich von Zeit zu Zeit dlls einbinden, die ich mit c++ programmiere um vor allem auf win funktionen zurückgreifen zu können.
ich kann zwar etwas c++, aber mit dlls habe ich mich noch nie befasst:
für blitzbasic muss ich spezielle dlls programmieren
BlitzBasic übergibt/empfängt nur den Pointer eines Speicherfeldes und die Länge in Byte. Die DLL-Funktion muss diese Daten dann verarbeiten können.
auszug aus der bbdoku:
so müsste eine blitzbasic taugliche dll ausehen:extern "C"{
_declspec(dllexport) int _cdecl my_dll_func( const void *in,int in_size,void *out,int out_sz );
}
The 'extern "C"' bit prevents C++ 'name-mangling', and the _cdecl bit prevents name decoration.ich kan damit leider wenig anfangen.
ist es möglich das es hier jemanden gibt:
der mir erklären kann, oder einfach ein beispiel machen kann wie ich mit c++
eine dll schreib die die vorgaben von bblitzbasic berücksichtigt?????????
es reicht schon wenn von mir aus eine variable zurückgegeben wird.
dh. wenn ich mit blitzbasic diese dll aufruf,dass ich dann eine integer zahl erhalte.wäre wirklich sehr nett!
falls etwas unklar sein sollte frag ruhig!!
-
kann mir jmd. wenigsten den aufbau erklären wie ich eine dll erstellen muss?
vc++ gibt mir dies vor:
#include "stdafx.h" //vorkompilierten Header-Datei BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; }
reicht das schon?
und wie bau ich jetzt eine funktion ein die einen wert zurück gibt´??
am besten eine funktion in dieser form:extern "C"{ _declspec(dllexport) int _cdecl my_dll_func( const void *in,int in_size,void *out,int out_sz ); }
-
das wars doch schon fast:
extern "C"{ _declspec(dllexport) int _cdecl my_dll_func( const void *in,int in_size,void *out,int out_sz ); } _declspec(dllexport) int _cdecl my_dll_func( const void *in,int in_size,void *out,int out_sz ) { // da kommt dein code rein!! }
-
super vielen dank! jetzt geht es.
-
ich verwende die dll um den inhalt der zwischenablage zurückzugeben.
aber da blitzbasic als rückgabewerte von einer dll nur int, byte, float, und short akzeptiert und auch keine pointer kennt weiß ich nicht wie ich am besten den ganzen string übergeben soll.
oder muss ich die dll so oft aufrufen bis ich den ganzen string ausgelesen habe?#include <windows.h> #include "stdafx.h" #include <string> bool GetStringFromClipboard(char *pBuffer) { if(!IsClipboardFormatAvailable(CF_TEXT)) return false; if(!(OpenClipboard(NULL))) return false; char *pTemp = (char*)GetClipboardData(CF_TEXT); int bytesToCopy = strlen(pTemp); if(bytesToCopy > 99) bytesToCopy = 99; memcpy(pBuffer, pTemp,bytesToCopy); pBuffer[bytesToCopy] = 0; CloseClipboard(); return true; } BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } extern "C"{ _declspec(dllexport) char _cdecl my_dll_func( const void *in,int in_size,void *out,int out_sz ); } _declspec(dllexport) char _cdecl my_dll_func( const void *in,int in_size,void *out,int out_sz ) { char szText[100]; if(GetStringFromClipboard(szText)) { return szText[0]; //1.zeichen übergeben } return 0 }
-
Lies mal in deiner Doku nach wofür der 3. Parameter gedacht ist.
Ich vermute mal (da der 4. ja dessen Größe angibt), dass er für solche Dinge da ist.
-
Hmm, du willst einen String zurückgeben? Also nach dem obigen Prinzip brauchst du in BB 2 Banks. eine die die input bank(die die daten an die dll sendet) und eine output bank (die die Daten in BB wieder ausliest. der 2 sowie 3 parameter ist die größe der bank bzw der struktur. wenn du nur einen string zurücksenden willst, dann geb ihn über return zurück. Als beispiel:
//main.cpp #include <windows.h> EXPORT const char* CALLBACK SendString(const char *inBuffer) { return inBuffer; }
//main.h #ifndef __CPLUSPLUS #define EXPORT extern "C" __declspec (dllexport) #else #define EXPORT __declspec (dllexport) #endif EXPORT const char* CALLBACK SendString(const char *);
Strings kannst du nur als CStrings und als const zurückgeben, sonst macht BB stress.