Clipboard
-
oh, das hätte ich sogar merken müssen.

jetzt kreidet er mir noch szTemp und szBuffer als nichtdeklarierter Bezeichner an, gibts da auch so eine leichte lösung?

-
wieder an fünftausend dinge gedacht beim schreiben
[cpp]
int main(int argc, char* argv[])
{
char szText[512];if(GetStringFromClipboard(szText))
printf("%s\n", szText);
else
printf("fehler\n");return 0;
}[/cpp]
-
jaaaaaa! jetzt gehts! vielen dank du hast mir echt geholfen!!!!!!!

eine kl. frage hätte ich noch: ich bekomme die warnung: GetStringFromClipboard' : Nicht alle Steuerelementpfade geben einen Wert zurück
was heißt das?
-
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