Konuyu görüntüle
IUCODERS FORUM > Programlama > C / C++ > jpeg kaydetme - winapi
Yazar
huseyinkozan


avatar
Serik
Kayıt: 21.03.2007
04.03.2008-10:55 #39184
selam, şöle bi sorunum var, epey uğraştım çözemedim:

// ekran görüntüsünden aldığım bmp yi jpeg kaydetmek için fonk.
void saveJpeg(void)
{
	Image * b = new Image(L"test.bmp");
	CLSID jpgclsid;
	GetEncoderClsid(L"image/jpeg", &jpgclsid);
	if(Ok != b->Save(L"screenshot.jpg", &jpgclsid))
		MessageBox(NULL, L"Screen to Compat Blt Failed", L"Error", MB_OK);
	delete b;
}


burda şu hatayı veriyo : First-chance exception at 0x770fd058 in YukselBilgisayarClient.exe: 0xC0000005: Access violation writing location 0x00000014.

inline Status 
GetImageEncodersSize(
    OUT UINT *numEncoders, 
    OUT UINT *size)
{
    return DllExports::GdipGetImageEncodersSize(numEncoders, size);
}


bunu çağıran da şuradan alınmış ( jpeg için CLSID yi almaya yarayan) fonksiyon:
http://msdn2.microsoft.com/en-us/library/ms533843(VS.85).aspx

ayrıca derleyiciye şu yoldan gdiplus.lib i tanıttım:
Project > Project Properties > Conf. Prop. > Linker > Input > Add. Dep. > gdiplus.lib

fikri olan var mı ?







Yazar
caglarmenguc


avatar
istanbul
Kayıt: 29.01.2006
04.03.2008-21:42 #39217
merhaba.
kodu denemedim ama aynı sorunla karşılaşmış kişinin exception almasının nedeni GDI+ ı initialize etmeyi unutmasıymış;

hatta o kişinin kendi ağzından;
the problem for jpeg got solved. i haven't initialized the GDI+ that was the problem there.

ilgili link;
http://www.codeguru.com/forum/archive/index.php/t-366244.html

verdiğin linkte nasıl initialize edileceği var (http://msdn2.microsoft.com/en-us/library/ms533843(VS.85).aspx)
// Initialize GDI+.
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);





Life is a game of cards...
A good player, even with a bad hand of cards, will play well and emerge a winner...


Yazar
huseyinkozan


avatar
Serik
Kayıt: 21.03.2007
04.03.2008-23:24 #39229
abi çok mersi yaa
ben o initialize kısmını bmp ile halledicem diye silmiştim, sonra da tekrar kullanınca patladı tabi

thx a lot

bişey daha sorsam, CLSID nesnesini delete jpg... ile silmeye çalışınca :
Error 1 error C2440: 'delete' : cannot convert from 'CLSID' to 'void *'

diyo, bunu <static_cast> ile bişeyler yapmak mı lazım ? (bunun ne olduğunu bilmiyorum bu arada, bi yerde gördüydüm : )
CLSID nin delete operatörü ezilmiş (override mıydı neydi o kelime :) edilmiş, DeleteObject denen fonk. da işe yaramıyo. nesneyi silmezsem akıtıcam ( leak yapcam manasına : )

bu nasıl çalışır ?






Yazar
clairvoyant


avatar
Antalya
Kayıt: 05.05.2006
05.03.2008-00:19 #39247
Sadece new operatörü ile oluşturulmuş nesneler delete operatörü ile yok edilir diye biliyorum. Normal bir değişken gibi oluşturulan nesneler de fonsiyon sonlandığında bellekten siliniyor.





Let`s make this world a better place to live !

Yazar
caglarmenguc


avatar
istanbul
Kayıt: 29.01.2006
06.03.2008-09:09 #39361
new ile yer ayrılan değişkenler heap de dururlar, eğer uygulama çalışıyorken new ile yer ayrılan değişkenler delete ile silinmezse memory leak ile karşılaşılır, yani program bellekte şişmeye başlar.

new ile yer ayrılmamış değişkenlerde heap alanı kullanılmaz. stack te yer ayrılır ve değişkene ait scope tan çıkıldığında artık o bellek alanını için başka bir değişken tahsisi yapılabilir.

sonuç olarak; sadece new ile heap te yer ayırdığınız göstericileri delete ile silebilirsiniz. stack te duran değişkenler delete ile silinemezler. stack in kontrolü işletim sistemine aittir.





Life is a game of cards...
A good player, even with a bad hand of cards, will play well and emerge a winner...


Del.icio.us
Digg
Facebook
Furl
Google
Blink
Simpy
Spurl
Y! MyWeb