2016-07-22 8 views
1

Ich arbeite an einer C/S-Anwendung, Server in C++ und Client in C#, ich muss einige Informationen über aktuelle laufende Prozesse und verwandte Symbol senden. I Icon-Datei dank EnumWindows mit diesem Code innerhalb des Rückrufs ...Get Bytes/char * von hIcon/hBitmap

// Get the window icon 
HICON hIcon = (HICON)(::SendMessageW(hWnd, WM_GETICON, ICON_SMALL, 0)); 
if (hIcon == 0) { 
    // Alternative method. Get from the window class 
    hIcon = reinterpret_cast<HICON>(::GetClassLongPtrW(hWnd, GCLP_HICONSM)); 
} 
// Alternative: get the first icon from the main module 
if (hIcon == 0) { 
    hIcon = ::LoadIcon(GetModuleHandleW(0), MAKEINTRESOURCE(0)); 
} 
// Alternative method. Use OS default icon 
if (hIcon == 0) { 
    hIcon = ::LoadIcon(0, IDI_APPLICATION); 
} 

OK bekommen, jetzt habe ich die Icon und ich kann "print" es (nur für den Check) mit DrawIcon().

Meine Frage ist: Wie bekomme ich Bytes daraus? Ich brauche einen Puffer, um diese Daten an meinen Client zu senden und die gleichen Daten zu konvertieren, um das Symbol in einer Liste anzuzeigen (Icon + Prozessname). Also, ich brauche Bytes dieses Symbols/hIcon (oder Bitmap/hBitmap, etc.) (Natürlich brauche ich Hilfe für Server-Seite.)

Ich denke, es ist gut, das Symbol in einem Temp-Puffer zu kopieren bekomme Bytes, aber nichts funktioniert.

Jede Hilfe wäre willkommen.

EDIT:

@DavidHeffernan danke für die Antwort. Ich habe das gefunden: Converting-DDB-to-DIB durch StackOverflow's vergangenen Fragen (sorry wenn es falsch ist externe Links zu posten). Jetzt, mit GetDIBits() Ich habe im fünften param die LPVOID lpvBits, das heißt "Ein Zeiger auf einen Puffer, um die Bitmap-Daten msdn - GetDIBits()" zu empfangen Nun, wie soll ich von lpvBits senden? Was ist mit Bitmap-Größe?

+0

GetIconInfo. Sie werden jedoch etwas über GDI lernen müssen. –

+0

Es liegt in Ihrer Verantwortung, einen Puffer für den Empfang der Bitmap-Daten zu reservieren. –

Antwort

3

Ich habe etwas auf MSDN und StackOverflow gefunden und hat mir geholfen:link;

#include "stdafx.h" 
#include <windows.h> 
#include <olectl.h> 
#pragma comment(lib, "oleaut32.lib") 

HRESULT SaveIcon(HICON hIcon, const wchar_t* path) { 
// Create the IPicture intrface 
PICTDESC desc = { sizeof(PICTDESC) }; 
desc.picType = PICTYPE_ICON; 
desc.icon.hicon = hIcon; 
IPicture* pPicture = 0; 
HRESULT hr = OleCreatePictureIndirect(&desc, IID_IPicture, FALSE, (void**)&pPicture); 
if (FAILED(hr)) return hr; 

// Create a stream and save the image 
IStream* pStream = 0; 
CreateStreamOnHGlobal(0, TRUE, &pStream); 
LONG cbSize = 0; 
hr = pPicture->SaveAsFile(pStream, TRUE, &cbSize); 

// Write the stream content to the file 
if (!FAILED(hr)) { 
    HGLOBAL hBuf = 0; 
    GetHGlobalFromStream(pStream, &hBuf); 
    void* buffer = GlobalLock(hBuf); 
    HANDLE hFile = CreateFile(path, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0); 
    if (!hFile) hr = HRESULT_FROM_WIN32(GetLastError()); 
    else { 
     DWORD written = 0; 
     WriteFile(hFile, buffer, cbSize, &written, 0); 
     CloseHandle(hFile); 
    } 
    GlobalUnlock(buffer); 
} 
// Cleanup 
pStream->Release(); 
pPicture->Release(); 
return hr; 

} 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    HICON hIcon = (HICON)LoadImage(0,   L"c:\\windows\\system32\\perfcentercpl.ico", IMAGE_ICON, 32, 32,  LR_LOADFROMFILE); 
    if (!hIcon) return GetLastError(); 
    HRESULT hr = SaveIcon(hIcon, L"c:\\temp\\test.ico"); 
    return hr; 
} 

Dank SaveIcon() ich es retten kann und nach, wenn nötig, kann ich es als binäre Datei öffnen und über Socket senden.

+0

Bitte fügen Sie weitere Informationen zu Ihrem Beitrag hinzu. Wenn sich der Link ändert, hilft Ihre Antwort niemandem. – dckuehn

+1

... fertig. Vielen Dank! –