Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Info Coronavirus/Vaccinare vs Fake News

Problema activare Xbox live gold ...

Fluierat Astra H 1.9 CDTI

Excel - Intrebare referitoare la ...
 Caut dentist care sa pune plombe ...

Grinzi suspendate

BluRay Player 4k

Calorifer
 Dovada talon

Denumire Club de Noapte

Știri legate de Stația ...

Sfat achizitie componente
 Locul unde se salveaza jocurile

Analizator antena Ringexpert

Spionul - The Spy (2019)

Versuri melodie
 

[HELP]Vreau sa extrag un icon dintr-un executabil

- - - - -
  • Please log in to reply
11 replies to this topic

#1
bluepoint

bluepoint

    New Member

  • Grup: Members
  • Posts: 7
  • Înscris: 23.08.2010
Deci, ce vreau sa fac mai exact: vreau sa extrag icon-ul unui executabil si sa il utilizez. Problema mea este ca daca folosesc functia ExtractIcon() obtin numai un handle spre resursa respectiva, si il pot folosi numai ca parametru pentru DrawIcon() sau DrawIconEx(). Ei bine, eu am nevoie de un pointer spre array-ul care contine icon-ul. Daca exista vre-o functie care sa imi returneze un pointer folosind handle-ul ar fi grozav, dar ma indoiesc...

Asadar si prin urmare, ExtractIcon() nu pare a fi o alegere prea fericita. Asa ca am incercat o alta abordare. Am incercat sa obtin un handle al icon-ului cu FindResource(), iar apoi ar fi fost foarte simplu sa folosesc LoadResource() si LockResource() ca sa obtin pointerul de care am nevoie. Din pacate cu FindResource() nu prea pot sa incarc nicio resursa din executabil cu exceptia resurselor adaugate de mine in executabile compilate in VB.

In final, am incercat si functia EnumResourceNames() care pare sa returneze un singur rezultat, atunci cand o aplic pe un executabil compilat de mine in VB, in care am adaugat o resursa de tip CUSTOM cu numele 101. Pe acelasi executabil am aplicat in prealabil UpdateResource() cu care am adaugat niste stringur, dar se pare ca nici pe alea nu prea pot sa le "vad" cu nici una din functiile mentionate.

Ceea ce caut, este un exemplu simplu, fara prea multe linii de cod, ca sa pot sa il inteleg, si sa-mi dau seama cum functioneaza aceste functii si care este greseala pe care o fac.

Va multumesc in avans pentru eventualele raspunsuri.

P.S. Daca aplic EnumResourceNames pe Winamp.exe de exemplu, nu imi returneaza nimic.

Edited by bluepoint, 23 August 2010 - 06:40.


#2
msmihai

msmihai

    Senior Member

  • Grup: Senior Members
  • Posts: 5,259
  • Înscris: 02.09.2006
cautand pe net am dat de asta...

HICON hICon = AfxGetApp()->LoadStandardIcon(IDI_EXCLAMATION);
PICTDESC pictDesc;
pictDesc.cbSizeofstruct = sizeof(PICTDESC);
pictDesc.icon.hicon = hICon;
pictDesc.picType = PICTYPE_ICON;
IPicture *pPicture = NULL;
IStorage *pStg = NULL;
IStream *pStream = NULL;
LONG lSize = 0;

HRESULT hr = OleCreatePictureIndirect(&pictDesc,IID_IPicture,TRUE,(void**)&pPicture);
hr = StgCreateDocfile(L"c:\\My.ico",STGM_CREATE|STGM_SHARE_EXCLUSIVE|STGM_READWRITE,0,&pStg);
hr = pStg->CreateStream(L"icoStream",STGM_CREATE |
STGM_WRITE |
STGM_DIRECT |
STGM_SHARE_EXCLUSIVE ,0,0,&pStream);
hr = pPicture->SaveAsFile(pStream,TRUE,&lSize);

e in C++ dar ai prins ideea.

sau asa ceva

void WriteBMPFile(HBITMAP bitmap, LPTSTR filename, HDC hDC)
{
BITMAP bmp;
PBITMAPINFO pbmi;
WORD cClrBits;
HANDLE hf; // file handle
BITMAPFILEHEADER hdr; // bitmap file-header
PBITMAPINFOHEADER pbih; // bitmap info-header
LPBYTE lpBits; // memory pointer
DWORD dwTotal; // total count of bytes
DWORD cb; // incremental count of bytes
BYTE *hp; // byte pointer
DWORD dwTmp;

// create the bitmapinfo header information

if (!GetObject( bitmap, sizeof(BITMAP), (LPSTR)&bmp)){
printf("Could not retrieve bitmap info");
return;
}

// Convert the color format to a count of bits.
cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel);
if (cClrBits == 1)
cClrBits = 1;
else if (cClrBits <= 4)
cClrBits = 4;
else if (cClrBits <= 8)
cClrBits = 8;
else if (cClrBits <= 16)
cClrBits = 16;
else if (cClrBits <= 24)
cClrBits = 24;
else cClrBits = 32;


// Allocate memory for the BITMAPINFO structure.
if (cClrBits != 24)
pbmi = (PBITMAPINFO) LocalAlloc(LPTR,
sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * (1<< cClrBits));
else
pbmi = (PBITMAPINFO) LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER));

// Initialize the fields in the BITMAPINFO structure.

pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = bmp.bmWidth;
pbmi->bmiHeader.biHeight = bmp.bmHeight;
pbmi->bmiHeader.biPlanes = bmp.bmPlanes;
pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel;
if (cClrBits < 24)
pbmi->bmiHeader.biClrUsed = (1<<cClrBits);

// If the bitmap is not compressed, set the BI_RGB flag.
pbmi->bmiHeader.biCompression = BI_RGB;

// Compute the number of bytes in the array of color
// indices and store the result in biSizeImage.
pbmi->bmiHeader.biSizeImage = (pbmi->bmiHeader.biWidth + 7) /8 * pbmi->bmiHeader.biHeight * cClrBits;
// Set biClrImportant to 0, indicating that all of the
// device colors are important.
pbmi->bmiHeader.biClrImportant = 0;

// now open file and save the data
pbih = (PBITMAPINFOHEADER) pbmi;
lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);

if (!lpBits) {
printf("writeBMP::Could not allocate memory");
return;
}

// Retrieve the color table (RGBQUAD array) and the bits
if (!GetDIBits(hDC, HBITMAP(bitmap), 0, (WORD) pbih->biHeight, lpBits, pbmi,
DIB_RGB_COLORS)) {
printf("writeBMP::GetDIB error");
return;
}

// Create the .BMP file.
hf = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, (DWORD) 0,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
(HANDLE) NULL);
if (hf == INVALID_HANDLE_VALUE){
printf("Could not create file for writing");
return;
}
hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M"
// Compute the size of the entire file.
hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) +
pbih->biSize + pbih->biClrUsed
* sizeof(RGBQUAD) + pbih->biSizeImage);
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;

// Compute the offset to the array of color indices.
hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) +
pbih->biSize + pbih->biClrUsed
* sizeof (RGBQUAD);

// Copy the BITMAPFILEHEADER into the .BMP file.
if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER),
(LPDWORD) &dwTmp, NULL)) {
printf("Could not write in to file");
return;
}

// Copy the BITMAPINFOHEADER and RGBQUAD array into the file.
if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER)
+ pbih->biClrUsed * sizeof (RGBQUAD),
(LPDWORD) &dwTmp, ( NULL))){
printf("Could not write in to file");
return;
}


// Copy the array of color indices into the .BMP file.
dwTotal = cb = pbih->biSizeImage;
hp = lpBits;
if (!WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL)){
printf("Could not write in to file");
return;
}

// Close the .BMP file.
if (!CloseHandle(hf)){
printf("Could not close file");
return;
}

// Free memory.
GlobalFree((HGLOBAL)lpBits);
}

int _tmain(int argc, _TCHAR* argv[])
{
HBITMAP hBitmap;
HICON hIcon = LoadIcon( NULL,IDI_EXCLAMATION);

ICONINFO IconInfo;
GetIconInfo(hIcon, &IconInfo);
BITMAP bm;
GetObject(IconInfo.hbmColor, sizeof(bm), &bm);

HDC hDC= NULL;
HDC dcScreen = ::GetDC(NULL);
hDC = CreateCompatibleDC(dcScreen);

hBitmap = CreateCompatibleBitmap(dcScreen, bm.bmWidth,bm.bmHeight);

::ReleaseDC(NULL, dcScreen);
HBITMAP bmOld = (HBITMAP)SelectObject(hDC, hBitmap);
DrawIcon(hDC, 0, 0, hIcon);
SelectObject(hDC, bmOld);

WriteBMPFile(hBitmap, _T("C:\\bitmaptest.bmp"), hDC );

}


sa-ti mai caut ceva pe google?

ps. ce conteaza cate linii de cod are ?  :confuzzled:

Edited by msmihai, 23 August 2010 - 06:51.


#3
bluepoint

bluepoint

    New Member

  • Grup: Members
  • Posts: 7
  • Înscris: 23.08.2010

View Postmsmihai, on 23rd August 2010, 07:46, said:

cautand pe net am dat de asta...

HICON hICon = AfxGetApp()->LoadStandardIcon(IDI_EXCLAMATION);
PICTDESC pictDesc;
pictDesc.cbSizeofstruct = sizeof(PICTDESC);
pictDesc.icon.hicon = hICon;
pictDesc.picType = PICTYPE_ICON;
IPicture *pPicture = NULL;
IStorage *pStg = NULL;
IStream *pStream = NULL;
LONG lSize = 0;

HRESULT hr = OleCreatePictureIndirect(&pictDesc,IID_IPicture,TRUE,(void**)&pPicture);
hr = StgCreateDocfile(L"c:\\My.ico",STGM_CREATE|STGM_SHARE_EXCLUSIVE|STGM_READWRITE,0,&pStg);
hr = pStg->CreateStream(L"icoStream",STGM_CREATE |
STGM_WRITE |
STGM_DIRECT |
STGM_SHARE_EXCLUSIVE ,0,0,&pStream);
hr = pPicture->SaveAsFile(pStream,TRUE,&lSize);

e in C++ dar ai prins ideea.

Sincer n-am nici cea mai mica idee ce face aia. Din cate imi dau eu seama salveaza un icon. Eu nu vreau sa-l salvez vreau sa-l iau dintr-o alta aplicatie. De exemplu, am Notepad.exe si vreau sa-i incarc icon-ul in aplicatia mea.

Si, conteaza cate linii are codul ca vreau sa si inteleg ce face, nu sa-i dau copy/paste. Eu incerc totusi sa gasesc o solutie simpla si eleganta. In general exemplele cu n-spe mii de linii sunt optimizate pentru alte scopuri.  :P

#4
JayBird

JayBird

    IT Professional

  • Grup: Senior Members
  • Posts: 2,511
  • Înscris: 15.09.2009
Dupa ce ai obtinut handle la icon cu ExtractIcon folosesti DrawIcon ca sa-l desenezi intr-un picturebox (eventual ascuns daca nu vrei sa se vada) din aplicatia ta si apoi poti sa faci ce vrei cu pixelii aia.

#5
bluepoint

bluepoint

    New Member

  • Grup: Members
  • Posts: 7
  • Înscris: 23.08.2010

View PostJayBird, on 23rd August 2010, 08:22, said:

Dupa ce ai obtinut handle la icon cu ExtractIcon folosesti DrawIcon ca sa-l desenezi intr-un picturebox (eventual ascuns daca nu vrei sa se vada) din aplicatia ta si apoi poti sa faci ce vrei cu pixelii aia.

Pai eu il vroiam in format .ico. Cel mai eficient era sa il manipulez direct. Cu ce zici tu, ar trebui sa folosesc alte functii sa reproduc icon-ul, si tot nu ar fi posibil deoarece o data ce e imagine, in picturebox, adio transparenta...

#6
JayBird

JayBird

    IT Professional

  • Grup: Senior Members
  • Posts: 2,511
  • Înscris: 15.09.2009
Eh vrei un pic cam multe. Oricum DrawIconEx stie sa deseneze si cu transparenta folosing flagul DI_MASK. Cel mai important e sa inveti sa folosesti Google. Ai aici un proiect complet in VB care iti arata cum sa incarci si sa salvezi fisiere in format ICO inclusiv din executabile. Nu e chiar simplu dar e exact ce vrei tu:

http://www.vbacceler..._VB/article.asp

#7
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 28,237
  • Înscris: 10.08.2005
#1 Visual Basic Extract Icon

#8
bluepoint

bluepoint

    New Member

  • Grup: Members
  • Posts: 7
  • Înscris: 23.08.2010

View PostMarianG, on 23rd August 2010, 14:49, said:

#1 Visual Basic Extract Icon

Daca ai fi citit mai bine ce am scris, ai fi inteles ca ExtractIcon() nu ma ajuta. Sa va explic ce vreau defapt sa fac. Vreau sa extrag icon-ul dintr-un exe gen Winamp.exe si sa il aplic unui alt exe cu UpdateResource() astfel incat in final ambele aplicatii vor avea aceeasi iconita.

Deci, mai zic inca o data ExtractIcon() nu ma ajuta deoarece rezultatul poate fi folosit doar cu DrawIcon(), si pe mine nu ma intereseaza sa-l afisez.

Apropo, am rascolit google pentru doua zile la rand, si nu am gasit nimic care sa ma ajute, asa ca, sa nu credeti ca raspunsul e asa de evident.

#9
msmihai

msmihai

    Senior Member

  • Grup: Senior Members
  • Posts: 5,259
  • Înscris: 02.09.2006
uite cum arata o bucatica de cod in C#. Poate te inspiri...

namespace extracticon {
	class Program {
		static void Main(string[] args) {
			string path = @"program.exe";
			Icon icon = Icon.ExtractAssociatedIcon(path);
			FileStream fs = new FileStream(@"c:\icon.ico", FileMode.Create,FileAccess.Write);
			icon.Save(fs);
			fs.Close();
		}
	}
}

Am folosit System.Drawing.Icon

Edited by msmihai, 23 August 2010 - 22:17.


#10
bluepoint

bluepoint

    New Member

  • Grup: Members
  • Posts: 7
  • Înscris: 23.08.2010

View Postmsmihai, on 23rd August 2010, 23:17, said:

uite cum arata o bucatica de cod in C#. Poate te inspiri...

namespace extracticon {
	class Program {
		static void Main(string[] args) {
			string path = @"program.exe";
			Icon icon = Icon.ExtractAssociatedIcon(path);
			FileStream fs = new FileStream(@"c:\icon.ico", FileMode.Create,FileAccess.Write);
			icon.Save(fs);
			fs.Close();
		}
	}
}

Am folosit System.Drawing.Icon

In .Net stiu ca e destul de simplu. Eu vroiam totusi sa implementez asta in VB6 folosind API...

In cel mai rau caz, voi face o aplicatie separata numai pentru asta. Oricum, mersi pentru ajutor...

#11
JayBird

JayBird

    IT Professional

  • Grup: Senior Members
  • Posts: 2,511
  • Înscris: 15.09.2009

View Postbluepoint, on 23rd August 2010, 22:23, said:

Daca ai fi citit mai bine ce am scris, ai fi inteles ca ExtractIcon() nu ma ajuta. Sa va explic ce vreau defapt sa fac. Vreau sa extrag icon-ul dintr-un exe gen Winamp.exe si sa il aplic unui alt exe cu UpdateResource() astfel incat in final ambele aplicatii vor avea aceeasi iconita.

Deci, mai zic inca o data ExtractIcon() nu ma ajuta deoarece rezultatul poate fi folosit doar cu DrawIcon(), si pe mine nu ma intereseaza sa-l afisez.

Apropo, am rascolit google pentru doua zile la rand, si nu am gasit nimic care sa ma ajute, asa ca, sa nu credeti ca raspunsul e asa de evident.

Nu stiu ce ai rascolit tu dar raspunsul e foarte evident si ti l-am si aratat mai sus. In exemplul ala ai clasa cFileIcon care face exact ce vrei tu folosind doar VB6 si functii API. Printre altele face si ce a scris msmihai in .NET, extrage un icon dintr-un executabil si il salveaza in format ICO. Ti-am spus ca nu e usor cum credeai tu, 2-3 linii de cod, dar asta e procedeul:

http://www.vbacceler...ileIcon_cls.asp

Daca il intelegi bine, daca nu mai studiaza.

#12
razvanflorin

razvanflorin

    Junior Member

  • Grup: Members
  • Posts: 27
  • Înscris: 12.01.2012
ai nevoie de resource tuner cu ala poti lua orice din orice executabil/dll etc... il gasesti pe net trial 30 days :P cautal pe gogu  :console:

Edited by razvanflorin, 12 January 2012 - 00:17.


Anunturi

Bun venit pe Forumul Softpedia!

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate