Clipboard
-
Wenns so nicht funktioniert verschieb ich dich besser ins WinAPI-Forum da du hier eindeutig auf die WinAPI zugreifen musst

@mata: Nein daran liegts nicht, weil Speicher schon in der Funktion bereit gestellt wird, nur freigeben muss er ihn noch (und das soll er laut MSDN gar nicht afaik)
MfG SideWinder
-
Dieser Thread wurde von Moderator/in SideWinder aus dem Forum DOS und Win32-Konsole in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
ok, mal schauen ob hier mir jemand helfen kann.

-
du musst die daten natürlich auch irgendwo hinkopieren.

allerdings wäre das bei deiner funktion nur möglich in eine globale variable denn wenn du den scope verlässt zerstörst du cBuffer und einen pointer zurückgeben der auf eine globale variabele zurückgeben macht keinen sinn.kleiner denkanstoss, hab ich einfach mal so aus dem stehgreif geschrieben.
ist nicht getestet. müsste aber funzen.bool GetStringFromClipboard(char *pBuffer) { if(!IsClipboardFormatAvailable(CF_TEXT)) return false; if(!(OpenClipboard(NULL))) return false; char *pTemp = (char*)GetClipboardData(CF_TEXT); // TODO: darauf achten das der buffer gross genug ist // evtl. noch zusätzlichen parameter mit maximaler grösser // und fehlerabfangung memcpy(pBuffer, pTemp, strlen(pTemp)); CloseClipboard(); } int main(int argc, char* argv[]) { char szText[512]; if(getStringFromClipboard(szBuffer)) printf("%s\n", szTemp); else printf("fehler\n"); return 0; }
-
danke, hast dir ja extra arbeit gemacht

ich bekomme leider noch eine fehlermeldung: " getStringFromClipboard' : nichtdeklarierter Bezeichner" zurück.

-
wie gesagt nicht getestet.
aber das lässt sich lösen 
[cpp]
if(GetStringFromClipboard(szBuffer))
[/cpp]
-
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
