Clipboard
-
miller_m muss man nicht GlobalLock auf das Handle von GetClipboardData aufrufen um an die Daten zu kommen?
-
Noir schrieb:
eine kl. frage hätte ich noch: ich bekomme die warnung: GetStringFromClipboard' : Nicht alle Steuerelementpfade geben einen Wert zurück
was heißt das?das nach closeclipboard noch nen "return true;" kommen müsste.
GlobalLocker schrieb:
miller_m muss man nicht GlobalLock auf das Handle von GetClipboardData aufrufen um an die Daten zu kommen?
warum? mit GetClipboardData komme ich doch doch dran. hab keinen sinn darin gesehen.
-
Na ja, hab das bis jetzt bei allen Beispielen im Internet mit GlobalLock gesehen. Vielleicht geht es ja nur zufällig.

-
noch ne frage

benötige ich hier memcpy überhaupt, damit kopiere ich doch einen Speicherbereich? aber man kann das hier weglassen und es geht noch.
-
aber man kann das hier weglassen und es geht noch.
glaube ich nicht.

-
stimmt sorry war blödsinn, ich hab nach dem entfernen die falsche exe gestartet. mit der ging es noch.

-
wenn die zeichenkette in der zwischenablage länger ist als mein array kommt es zu einer fehlermelung.
daher wollte ich nur die ersten 100 zeichen der zeichenkette in das array kopieren.so wollte ich dies machen:
bool GetStringFromClipboard(char *pBuffer) { if(!IsClipboardFormatAvailable(CF_TEXT)) return false; if(!(OpenClipboard(NULL))) return false; char *pTemp = (char*)GetClipboardData(CF_TEXT); memcpy(pBuffer, pTemp,strlen(pTemp)); char str[100]; strcpy(str,pBuffer); strncpy(pBuffer,str,100); //<--------------- CloseClipboard(); return true;aber anscheinend ist das wiede total falsch.................
-
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; // NUL-Zeichen anhängen, damit der String auch sauber terminiert ist. CloseClipboard(); return true; }Du könntest das Ganze jetzt noch so abwandeln, dass du der Funktion die Größe deines Buffers mit übergibst.
-
perfekt, haut jetzt wunderbar hin! vielen dank.

-
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
