Clipboard
-
ich verwende diese funktion für eine dll für eine andere programmiersprache:
die dll funktioniert auch super, aber ich kann immer nur ein zeichen übergeben.
die programmiersprache für welche die dll sein soll kann keine strings übernehmen (nur int, byte, short, float) und kennt auch keine pointer.
gibt es eine andere möglichkeit den ganzen text aufeinmal zu übergeben, oder muss ich die dll sooft aufrufen bis ich allen text hab?#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 }
-
Noir schrieb:
die programmiersprache für welche die dll sein soll kann keine strings übernehmen (nur int, byte, short, float) und kennt auch keine pointer.
gibt es eine andere möglichkeit den ganzen text aufeinmal zu übergeben, oder muss ich die dll sooft aufrufen bis ich allen text hab?Also, wenn es wirklich nur diese Typen geben sollte, dann wüsste ich nicht, wie du den Text auf einmal übergeben können solltest bzw. wie du darauf zugreifen kannst. Aber was machst du denn dann dort überhaupt mit den Daten, wenn diese Programmiersprache (welche überhaupt?) keine Strings kennt

-
nein sie kennt schon strings, aber ich darf mir keine strings von dlls übergeben lassen.
aber ich glaub ich habe es jetzt, die chars übergeb ich als int zahlen
diese kann ich mit dem outbuffer übergeben. (*out)
-
Du bist ein Quatschkopf

Klar kannst du BB Strings übergeben aus einer DLL, das ist kein Problem. Siehe dazu mal im Forum unter "Rund um die Programmierung" bei deinem Beitrag "DLL für BlitzBasic". Da hab ich dir ein Beispiel gegeben wie du Strings zurückgibts und übergibst.
-
danke erstmal hat ich noch gar nicht gesehen.

aber wie frag ich das in bb dann ab? du kennst dich damit anscheinend auch aus?
wäre toll wenn du mir das auch noch sagen würdest.
-
Jup, ich kenn mich damit aus. Ich werd mir das jetzt mal zu gemüte führen und die Funktion "normal" machen.

PS: ich bin auch im BB-Forum -> VirtualDreams
-
So, nun die vollstädige funktionierende Version:
//main.cpp #include <windows.h> using namespace std; EXPORT const char* CALLBACK Clipboard() { IsClipboardFormatAvailable(CF_TEXT); OpenClipboard(NULL); static char *pTemp = (char*)GetClipboardData(CF_TEXT); CloseClipboard(); return pTemp; }//main.h #ifndef __CPLUSPLUS #define EXPORT extern "C" __declspec (dllexport) #else #define EXPORT __declspec (dllexport) #endif EXPORT const char* CALLBACK Clipboard();//*.decls für BB GetClipboard$(): "_Clipboard@0"//BB-Code Print GetClipboard()Einzig und allein sag ich dir noch, sobald du keinen text im clipboard hast schmiert dein BB-Prog ab. Du müßtest also in der Clipboard-Funktion noch ne Abfrage einbauen.
Solltest du dort auch nicht weiterkommen helf ich dir dabei auch noch.
-
danke das du dir extra arbeit gemacht hast.
aber ich hab blitzbasic2d also kann ich keine userlibs benutzen
ich kann die dll nur mit calldll aufrufen.
und mir gelingt es immer nur mittels return einen wert an bb zurückzugeben.
ich hoffe du verstehst was ich mein is so schwer zu erklären
-
ist mit calldll auch nicht anders als ich es gemacht hab.
print calldll("DLLNAME","Clipboard")der 3 und 4 parameter ist optional.
Das müßtest du noch mal in der OH von BB nachlesen.
Mit dem Return versteh ich nicht.
-
ich kopier hier mal schnell den auszug aus der oh rein:
Gebe einfach den Dateinamen einer DLL-Datei. Prozedur-Name muss in der DLL-Datei enthalten sein (Groß-/Kleinschreibung beachten!).
Die optionalen Parameter "Eingabe" und "Ausgabe" sind die Identitäten von 2 Speicherfeldern (banks). Diese können Daten für die Ein-/Ausgabe enthalten.
Achtung! Es können nicht alle DLL's einfach so benutzt werden. Die DLL's müssen speziell für BlitzBasic entwickelt werden. 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. Aus diesem einfachen Grund können Standard-DLL's nicht benutzt werden, da die meistens andere Eingaben erwarten.
Parameter
Dll = Name der DLL-Datei
Funktion = Name der DLL-Funktion
Eingabe = Identität einer Bank mit Eingabewerten
Ausgabe = Identität einer Bank mit AusgabewertenRückgabewert
Ausgabewert wird zurückgeliefert (Integer). Zusätzlich werden Werte in der Ausgabebank gespeichert.Dies ist ein Prinzipbeispiel:
inbank=CreateBank(...)
outbank=CreateBank(...)
;Mit POKE-Befehlen Eingabedaten setzten
result=CallDLL("dllname","dllfunc",inbank,outbank)
;Mit PEEK-Befehlen Ausgabedaten lesenSo könnte ein Visual-C++ Code für eine DLL aussehen:
extern "C"{
_declspec(dllexport) int _cdecl my_dll_func( const void *in,int in_size,void *out,int out_size );
}"in"-Pointer zeigt auf die Eingabe-Speicherbank. "in_size"-Variable gibt die Länge der Daten an. "out"-Pointer zeigt auf die Ausgabe-Speicherbank. "out_size" gibt die Ausgabe-Länge an.
"cdecl"-Kennung deutet auf eine C-Declaration. "stdcall" kann seit v1.77 auch benutzt werden!
es geht leider immer noch nicht
mit return meinte ich, dass ich nur mit return einen wert nach bb geschafft habe zu übertragen:
_declspec(dllexport) int _cdecl my_dll_func( const void *in,int in_size,char *out,int out_sz )
{
return 1; //<-- übergabe vom int wert i
}
-
Habs grad auch nochgelesen (und probiert). sieht ganz danach aus das du mit 2 banks arbeiten mußt. die out_bank gibt dir dann den wert zuurück. um das aber nutzen zu können mußt du dich zwangsläufig mit den banks in bb auseinandersetzen. und die banks die du übergibts sind nicht mehr der standard aus bb, die mußt du entsprechend modifizieren (von bb aus). das ist ein bissel kompliziert und die bsp im bb-forum sind nicht grad verständlich ausgedrückt.
es gibt eine sample_dll im englischen bb-forum, die arbeitet aber nur mit integern. mit strings wirst du dich in dem falle schwer tun.eine bessere variante ist sich BB3D zuzulegen

-
ich muss ja nicht unbedingt den string als ganzes übergeben.
es würde ja reichen wenn man die einzelnen chars als int werte übergibt, und mit char() in bb wieder umwandelt.aber bei meinem jetzigen kenntnisstand kann ich mittels return immer nur einen wert zurückgeben.
aber es muss doch möglich sein pro dll aufruf gleich mehrere werte zu übergeben. halt irgendwie in die speicherbanks.
nur klappen tut es bei mir halt nicht

-
Hmm. die einfachste Variante ist in die outbank alle zeichen einzeln zu schreiben (das aber schon in der dll) und in bb per schleife wieder auzugeben. du kannst auch short oder byte als bank nehmen (wenn ich mich nicht irre). das problem der ganzen geschichte: ich bin hinter die bank sache auch noch nicht durchgestiegen. die bsp sind einfach zu lahm.
-
genauso hatte ich es vor, aber wie ich in c++ die werte der bank übergeb weiß ich auch nicht.
und die einzigen beispiele dich ich dazu im blitzcoder forum gefunden habe, waren immer nur welche, bei denen nur ein wert mit return zurück gegeben wurde.
.....
-
Hmm, ich schau mir das jetzt mal genauer an mit den banks und dll. vlt krieg ich ja was hin.
-
danke, aber mach dir nicht zu viel stress!!
