Здравствуйте, Romaxa, Вы писали:
R> CDC* dc=AfxGetApp()->GetMainWnd()->GetDC(); //пытаюсь получить Нбитмап R> CDC dcBmp; ^ //рендеря IPicture на доп. CDC dcBmp.CreateCompatibleDC(dc); |------------//Может здесь баг так как я нахожусь в другой нити
А как стартует thread ? Рекомендуемый способ для MFC — через AfxBeginThread().
Эта фигня инициализирует MFC-шный мап Handle на Object, может здесь трабла ?
Re[2]: Ошибка создания OLE(bitmap) из потока!!! Помогите!!!
Здравствуйте, Romaxa, Вы писали:
R>Народ!!! R>Я использовал все способы запуска потоков, ни один не работает. R>Я уже всё перепробовал( наверное ) R>Может кто-нить напишет процедуру, которая будет брать в качестве параметров: R>(RichEditCtrl* edit, HBITMAP bitmap) и будет вставлять этот bitmap в edit, и будет работать даже если её вызвали из R>процедуры являющейся отделной нитью, можно заодно написать и тело этой процедуры!!! R>Буду очень благодарен от лица всего МАТ-МЕХа (СПбГУ)!!!!!
Блин, что за паника ?
Я же тебе предложил способ. Ты его опробовал ?
Нет времени писать.
Ошибка создания OLE(bitmap) из потока!!! Помогите!!!
Пытаюсь запустить процедуру, которая создает OLE объект, из потока,
созданного с помощью "hThread = CreateThread(NULL,0,Wait,&dwThrdParam,0,&dwThreadId);",
а он мне выдает "Unhandled exception in .... (KERNEL32.DLL) ....."????
Запускаю ту же процедуру по нажатию кнопки на
далоге — всё нормально!!!
Без потока мне не обойтись..., подскажите что можно сделать?
Re: Ошибка создания OLE(bitmap) из потока!!! Помогите!!!
Здравствуйте, Romaxa, Вы писали:
R>Пытаюсь запустить процедуру, которая создает OLE объект, из потока, R>созданного с помощью "hThread = CreateThread(NULL,0,Wait,&dwThrdParam,0,&dwThreadId);", R>а он мне выдает "Unhandled exception in .... (KERNEL32.DLL) ....."????
Может быть вас спасет _beginthreadex() и CoInitialize()
Re: Ошибка создания OLE(bitmap) из потока!!! Помогите!!!
Здравствуйте, Romaxa, Вы писали:
R>Пытаюсь запустить процедуру, которая создает OLE объект, из потока, R>созданного с помощью "hThread = CreateThread(NULL,0,Wait,&dwThrdParam,0,&dwThreadId);", R>а он мне выдает "Unhandled exception in .... (KERNEL32.DLL) ....."???? R>Запускаю ту же процедуру по нажатию кнопки на R>далоге — всё нормально!!!
OLE объекты должы создаваться в STA апратменте — нужно CoInitialize а для некоторых OleInitialize.
Это нужно выполнять в каждом потоке.
Re[2]: Ошибка создания OLE(bitmap) из потока!!! Помогите!!!
Здравствуйте, old->*Plutonia_Experiment(), Вы писали:
OE>Здравствуйте, Romaxa, Вы писали:
R>>Пытаюсь запустить процедуру, которая создает OLE объект, из потока, R>>созданного с помощью "hThread = CreateThread(NULL,0,Wait,&dwThrdParam,0,&dwThreadId);", R>>а он мне выдает "Unhandled exception in .... (KERNEL32.DLL) ....."???? R>>Запускаю ту же процедуру по нажатию кнопки на R>>далоге — всё нормально!!!
OE>OLE объекты должы создаваться в STA апратменте — нужно CoInitialize а для некоторых OleInitialize. OE>Это нужно выполнять в каждом потоке.
Попробовал сделать всё, что вы писали(Вставил CoInitialize & OLEInitialize в этот поток)
Результат: Ошибку больше не выводит, OLE(объект) тоже выводит в RichEdit, но битмап-а
я там не вижу
Может обьяснишь поподробнее Куда нужно вставлять CoInitialize & OLEInitialize(CoInitializeEx & OLEInitializeEx)
и с какими параметрами?
Заранее благодарен!!!!
Re[3]: Ошибка создания OLE(bitmap) из потока!!! Помогите!!!
Здравствуйте, Romaxa, Вы писали:
R>Попробовал сделать всё, что вы писали(Вставил CoInitialize & OLEInitialize в этот поток) R>Результат: Ошибку больше не выводит, OLE(объект) тоже выводит в RichEdit, но битмап-а R> я там не вижу R>Может обьяснишь поподробнее Куда нужно вставлять CoInitialize & OLEInitialize(CoInitializeEx & OLEInitializeEx) R> и с какими параметрами?
При старте потока в нем делаешь CoInitialize(или OleInitialize), но не оба вместе. При выходе в нем- CoUninitialize( или OleUninitialize). Параметры там должны быть нули. Потому, как все зарезервировано.
Делай лучше OleXXXXXXXX
Покажи, как битмап создаешь ?
И это, куда ты вставляешь, тот объект в каком апартменте ?
Re[4]: Ошибка создания OLE(bitmap) из потока!!! Помогите!!!
OE>При старте потока в нем делаешь CoInitialize(или OleInitialize), но не оба вместе. При выходе в нем- CoUninitialize( или OleUninitialize). Параметры там должны быть нули. Потому, как все зарезервировано. OE>Делай лучше OleXXXXXXXX
OE>Покажи, как битмап создаешь ? OE>И это, куда ты вставляешь, тот объект в каком апартменте ?
void CPopup::InsertSmile(CRichEditCtrl* edit)
{
CString text; edit->GetWindowText(text);
int l=text.Find("",0);
if (l>=0)
{ edit->SetSel(l,l+2);
CPicture m_P; //Class CPicture где-то рядом нарыл
m_P.Load(150,"GIF"); //загружает из ресурсов смайлик (150)
CRect rc;
rc.left=0;
rc.top=0;
rc.right=m_P.m_Width;
rc.bottom=m_P.m_Height;
CDC* dc=AfxGetApp()->GetMainWnd()->GetDC(); //пытаюсь получить Нбитмап
CDC dcBmp; ^ //рендеря IPicture на доп. CDC dcBmp.CreateCompatibleDC(dc); |------------//Может здесь баг так как я нахожусь в другой нити
CBitmap bmp; // И он неправильно CDC инициализирует???????
bmp.CreateCompatibleBitmap(dc,m_P.m_Width,m_P.m_Height);
CBitmap *pOld = dcBmp.SelectObject(&bmp);
CBrush br;
br.CreateSolidBrush(RGB(255,0,0));//Interface.MainDlgCont.BackGroundColor);
dcBmp.FillRect(rc,&br);
m_P.Show(&dcBmp,rc);
dcBmp.SelectObject(pOld);
dcBmp.DeleteDC();
HBITMAP hBitmap = (HBITMAP)bmp;
if (hBitmap)
{
CImageDataObject::InsertBitmap(edit->GetIRichEditOle(), hBitmap);//Создание OLE объекта } //из
HBITMAP и вставка его в RichEdit
bmp.DeleteObject(); //тоже нарыл где-то рядом
}
}
Re[5]: Ошибка создания OLE(bitmap) из потока!!! Помогите!!!
Здравствуйте, Romaxa, Вы писали:
OE>>При старте потока в нем делаешь CoInitialize(или OleInitialize), но не оба вместе. При выходе в нем- CoUninitialize( или OleUninitialize). Параметры там должны быть нули. Потому, как все зарезервировано. OE>>Делай лучше OleXXXXXXXX
OE>>Покажи, как битмап создаешь ? OE>>И это, куда ты вставляешь, тот объект в каком апартменте ?
CPicture — это скорее всего обертка над IPicture. В MFC есть CPictureHolder. Посмотри там.
Из IPicture можно взять HBITMAP. И рисовать его. Загружать можно много всего т Гифы и Джпг.
Возможно, ты слишком рано удаляешь битмапину
Re: Ошибка создания OLE(bitmap) из потока!!! Помогите!!!
Народ!!!
Я использовал все способы запуска потоков, ни один не работает.
Я уже всё перепробовал( наверное )
Может кто-нить напишет процедуру, которая будет брать в качестве параметров:
(RichEditCtrl* edit, HBITMAP bitmap) и будет вставлять этот bitmap в edit, и будет работать даже если её вызвали из
процедуры являющейся отделной нитью, можно заодно написать и тело этой процедуры!!!
Буду очень благодарен от лица всего МАТ-МЕХа (СПбГУ)!!!!!
Заранее благодарен!!!
Re[6]: Ошибка создания OLE(bitmap) из потока!!! Помогите!!!
OE>>>Покажи, как битмап создаешь ? OE>>>И это, куда ты вставляешь, тот объект в каком апартменте ?
OE>CPicture — это скорее всего обертка над IPicture. В MFC есть CPictureHolder. Посмотри там. OE>Из IPicture можно взять HBITMAP. И рисовать его. Загружать можно много всего т Гифы и Джпг.
OE>Возможно, ты слишком рано удаляешь битмапину
OE>
Есть другие способы достать из IPicture HBITMAP (кроме как рендеря IPicture на другие DC и доставая оттуда Bitmap)???
в IPicure я загружаю картику из GIF-a, и просто достать оттуда битмап
методом: HBITMAP bit=(HBITMAP)iPicture
у меня не получается(пытаюсь сделать из этого битмапа OLE — говорит неправильный хэндл(invalid handle))
Re[7]: Ошибка создания OLE(bitmap) из потока!!! Помогите!!!
Здравствуйте, Romaxa, Вы писали:
OE>>>>Покажи, как битмап создаешь ? OE>>>>И это, куда ты вставляешь, тот объект в каком апартменте ?
OE>>CPicture — это скорее всего обертка над IPicture. В MFC есть CPictureHolder. Посмотри там. OE>>Из IPicture можно взять HBITMAP. И рисовать его. Загружать можно много всего т Гифы и Джпг.
OE>>Возможно, ты слишком рано удаляешь битмапину
OE>>
R>Есть другие способы достать из IPicture HBITMAP (кроме как рендеря IPicture на другие DC и доставая оттуда Bitmap)???
IPicture::get_Handle — вот так можно получить хендл.
Re[3]: Ошибка создания OLE(bitmap) из потока!!! Помогите!!!
OE>Блин, что за паника ? OE>Я же тебе предложил способ. Ты его опробовал ? OE>Нет времени писать.
CoInitialize & OleInitialize я пробовал
короче дело не в битмапах, с ними всё нормально(проверил след-ий код)
CBitmap bit;
bit.LoadBitmap(IDB_BIT);
HBITMAP hBitmap = (HBITMAP)bit;
if (hBitmap)
{
CImageDataObject::InsertBitmap(edit->GetIRichEditOle(), hBitmap);
}
тоже самое что и раньше, хотя bitmap точно есть!, значит баг идет
Где-то в -> InsertBitmap(edit->GetIRichEditOle(), hBitmap);
У тебя несколько потоков — в каждом из них свой STA-апартмент. IPicture марашалиться не умеет. И Ричэтит тоже. Поэтому делай или все в одном потоке или пересылай данные чз IStream.
R>CoInitialize & OleInitialize я пробовал R>короче дело не в битмапах, с ними всё нормально(проверил след-ий код) R>CBitmap bit; R>bit.LoadBitmap(IDB_BIT); R>HBITMAP hBitmap = (HBITMAP)bit; R>if (hBitmap) R>{ R> CImageDataObject::InsertBitmap(edit->GetIRichEditOle(), hBitmap); R>} R>тоже самое что и раньше, хотя bitmap точно есть!, значит баг идет R>Где-то в -> InsertBitmap(edit->GetIRichEditOle(), hBitmap);
R>Вот как я вызаваю эту функцию(и она не работает):
R>UINT Smile( LPVOID pParam ) R>{ R> OleInitialize(NULL); R> CImageDataObject::InsertBitmap(edit->GetIRichEditOle(), hBitmap); R> OleInitialize(NULL); R> AfxEndThread(0); R> return 0; R>}
R>AfxBeginThread(Smile,NULL); // Выводит только место для картинки(рамку), хотя размеры соответствуют!?