2009-08-12 19 views
22

Funkcja SetClipboardData wymaga odwołania do numeru HANDLE; Mam problem z przekonwertowaniem ciągu znaków do użycia w funkcji.Jak skopiować ciąg do schowka w C?

Oto mój kod:

char* output = "Test"; 
HLOCAL hMem = LocalAlloc(LHND,1024); 
char* cptr = (char*) LocalLock(hMem); 
memcpy(cptr, output, 500); 
SetClipboardData(CF_TEXT, hMem); 
LocalUnlock(hMem); 
LocalFree(hMem); 
CloseClipboard(); 

Co robię źle i co tu jest właściwy sposób to zrobić?

Dzięki.

Odpowiedz

45

Przeczytaj dokumentację MSDN dla funkcji SetClipboardData. Wygląda na to, że brakuje ci kilku kroków i przedwcześnie zwalniasz pamięć. Przed użyciem SetClipboardData musisz najpierw zadzwonić pod numer OpenClipboard. Po drugie, system przejmuje własność pamięci przekazanej do schowka i musi zostać odblokowany. Ponadto pamięć musi być ruchoma, co wymaga flagi GMEM_MOVEABLE, jak używana z GlobalAlloc (zamiast LocalAlloc).

const char* output = "Test"; 
const size_t len = strlen(output) + 1; 
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, len); 
memcpy(GlobalLock(hMem), output, len); 
GlobalUnlock(hMem); 
OpenClipboard(0); 
EmptyClipboard(); 
SetClipboardData(CF_TEXT, hMem); 
CloseClipboard(); 
+0

To działa! W trzeciej linii jest literówka. –

+0

Działa również dla mnie ... z dwiema poprawkami: GMEM_MOVEABLE i żaden parametr nie został przekazany w OpenClipboard(); – Harvey

+1

Po co kopiować również terminator o wartości równej zero? – Jack

0

Spójrz na Microsoft's Documentation on using the clipboard. Wymaga to korzystania z interfejsu WinAPI, ale nie powinno to stanowić problemu, ponieważ w systemie Windows. Zauważ, że programowanie interfejsu API systemu Windows nigdy nie jest proste, chyba że używasz języka bardzo wysokiego poziomu.

+0

No Już spojrzał na to i wpadł na kod, który nie działa. –

+0

Możesz po prostu spróbować skopiować dokładny kod i sprawdzić, czy działa. Potem możesz odejść. – Kredns

9

napisałem open source narzędzie wiersza polecenia, aby to zrobić w systemie Windows:

http://coffeeghost.net/2008/07/25/ccwdexe-copy-current-working-directory-command/

ccwd.exe kopiuje bieżący katalog roboczy do schowka. Jest to przydatne, gdy mam kilka poziomów w repozytorium źródłowym i muszę skopiować ścieżkę.

Oto pełna źródło:

#include "stdafx.h" 
#include "windows.h" 
#include "string.h" 
#include <direct.h> 

int main() 
{ 
    LPWSTR cwdBuffer; 

    // Get the current working directory: 
    if((cwdBuffer = _wgetcwd(NULL, 0)) == NULL) 
     return 1; 

    DWORD len = wcslen(cwdBuffer); 
    HGLOBAL hdst; 
    LPWSTR dst; 

    // Allocate string for cwd 
    hdst = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, (len + 1) * sizeof(WCHAR)); 
    dst = (LPWSTR)GlobalLock(hdst); 
    memcpy(dst, cwdBuffer, len * sizeof(WCHAR)); 
    dst[len] = 0; 
    GlobalUnlock(hdst); 

    // Set clipboard data 
    if (!OpenClipboard(NULL)) return GetLastError(); 
    EmptyClipboard(); 
    if (!SetClipboardData(CF_UNICODETEXT, hdst)) return GetLastError(); 
    CloseClipboard(); 

    free(cwdBuffer); 
    return 0; 
} 
+1

+1 dla CF_UNICODETEXT. – Jichao

Powiązane problemy