Ошибка создания OLE(bitmap) из потока!!! Помогите!!!
От: Romaxa  
Дата: 20.11.02 06:29
Оценка:
Пытаюсь запустить процедуру, которая создает OLE объект, из потока,
созданного с помощью "hThread = CreateThread(NULL,0,Wait,&dwThrdParam,0,&dwThreadId);",
а он мне выдает "Unhandled exception in .... (KERNEL32.DLL) ....."????
Запускаю ту же процедуру по нажатию кнопки на
далоге — всё нормально!!!
Без потока мне не обойтись..., подскажите что можно сделать?
Re: Ошибка создания OLE(bitmap) из потока!!! Помогите!!!
От: bnk СССР http://unmanagedvisio.com/
Дата: 20.11.02 07:38
Оценка:
Здравствуйте, Romaxa, Вы писали:

R>Пытаюсь запустить процедуру, которая создает OLE объект, из потока,

R>созданного с помощью "hThread = CreateThread(NULL,0,Wait,&dwThrdParam,0,&dwThreadId);",
R>а он мне выдает "Unhandled exception in .... (KERNEL32.DLL) ....."????

Может быть вас спасет _beginthreadex() и CoInitialize()
Re: Ошибка создания OLE(bitmap) из потока!!! Помогите!!!
От: old->*Plutonia_Experiment() Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.11.02 07:52
Оценка:
Здравствуйте, 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) из потока!!! Помогите!!!
От: Romaxa  
Дата: 20.11.02 08:34
Оценка:
Здравствуйте, 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) из потока!!! Помогите!!!
От: old->*Plutonia_Experiment() Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.11.02 08:53
Оценка:
Здравствуйте, Romaxa, Вы писали:

R>Попробовал сделать всё, что вы писали(Вставил CoInitialize & OLEInitialize в этот поток)

R>Результат: Ошибку больше не выводит, OLE(объект) тоже выводит в RichEdit, но битмап-а
R> я там не вижу
R>Может обьяснишь поподробнее Куда нужно вставлять CoInitialize & OLEInitialize(CoInitializeEx & OLEInitializeEx)
R> и с какими параметрами?

При старте потока в нем делаешь CoInitialize(или OleInitialize), но не оба вместе. При выходе в нем- CoUninitialize( или OleUninitialize). Параметры там должны быть нули. Потому, как все зарезервировано.
Делай лучше OleXXXXXXXX

Покажи, как битмап создаешь ?
И это, куда ты вставляешь, тот объект в каком апартменте ?
Re[4]: Ошибка создания OLE(bitmap) из потока!!! Помогите!!!
От: Romaxa  
Дата: 20.11.02 09:29
Оценка:
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) из потока!!! Помогите!!!
От: old->*Plutonia_Experiment() Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.11.02 09:39
Оценка:
Здравствуйте, Romaxa, Вы писали:

OE>>При старте потока в нем делаешь CoInitialize(или OleInitialize), но не оба вместе. При выходе в нем- CoUninitialize( или OleUninitialize). Параметры там должны быть нули. Потому, как все зарезервировано.

OE>>Делай лучше OleXXXXXXXX

OE>>Покажи, как битмап создаешь ?

OE>>И это, куда ты вставляешь, тот объект в каком апартменте ?

CPicture — это скорее всего обертка над IPicture. В MFC есть CPictureHolder. Посмотри там.
Из IPicture можно взять HBITMAP. И рисовать его. Загружать можно много всего т Гифы и Джпг.

Возможно, ты слишком рано удаляешь битмапину
Re[5]: Ошибка создания OLE(bitmap) из потока!!! Помогите!!!
От: bnk СССР http://unmanagedvisio.com/
Дата: 20.11.02 09:54
Оценка: -1
Здравствуйте, Romaxa, Вы писали:

R> CDC* dc=AfxGetApp()->GetMainWnd()->GetDC(); //пытаюсь получить Нбитмап

R> CDC dcBmp; ^ //рендеря IPicture на доп. CDC dcBmp.CreateCompatibleDC(dc); |------------//Может здесь баг так как я нахожусь в другой нити

А как стартует thread ? Рекомендуемый способ для MFC — через AfxBeginThread().
Эта фигня инициализирует MFC-шный мап Handle на Object, может здесь трабла ?
Re: Ошибка создания OLE(bitmap) из потока!!! Помогите!!!
От: Romaxa  
Дата: 21.11.02 00:57
Оценка:
Народ!!!
Я использовал все способы запуска потоков, ни один не работает.
Я уже всё перепробовал( наверное )
Может кто-нить напишет процедуру, которая будет брать в качестве параметров:
(RichEditCtrl* edit, HBITMAP bitmap) и будет вставлять этот bitmap в edit, и будет работать даже если её вызвали из
процедуры являющейся отделной нитью, можно заодно написать и тело этой процедуры!!!
Буду очень благодарен от лица всего МАТ-МЕХа (СПбГУ)!!!!!
Заранее благодарен!!!
Re[2]: Ошибка создания OLE(bitmap) из потока!!! Помогите!!!
От: old->*Plutonia_Experiment() Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.11.02 07:47
Оценка: -1
Здравствуйте, Romaxa, Вы писали:

R>Народ!!!

R>Я использовал все способы запуска потоков, ни один не работает.
R>Я уже всё перепробовал( наверное )
R>Может кто-нить напишет процедуру, которая будет брать в качестве параметров:
R>(RichEditCtrl* edit, HBITMAP bitmap) и будет вставлять этот bitmap в edit, и будет работать даже если её вызвали из
R>процедуры являющейся отделной нитью, можно заодно написать и тело этой процедуры!!!
R>Буду очень благодарен от лица всего МАТ-МЕХа (СПбГУ)!!!!!

Блин, что за паника ?
Я же тебе предложил способ. Ты его опробовал ?
Нет времени писать.
Re[6]: Ошибка создания OLE(bitmap) из потока!!! Помогите!!!
От: Romaxa  
Дата: 21.11.02 08:48
Оценка:
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) из потока!!! Помогите!!!
От: old->*Plutonia_Experiment() Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.11.02 09:23
Оценка:
Здравствуйте, 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) из потока!!! Помогите!!!
От: Romaxa  
Дата: 21.11.02 11:16
Оценка:
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);

Вот как я вызаваю эту функцию(и она не работает):

UINT Smile( LPVOID pParam )
{
OleInitialize(NULL);
CImageDataObject::InsertBitmap(edit->GetIRichEditOle(), hBitmap);
OleInitialize(NULL);
AfxEndThread(0);
return 0;
}

AfxBeginThread(Smile,NULL); // Выводит только место для картинки(рамку), хотя размеры соответствуют!?
Re[4]: Ошибка создания OLE(bitmap) из потока!!! Помогите!!!
От: old->*Plutonia_Experiment() Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.11.02 13:06
Оценка:
Здравствуйте, Romaxa, Вы писали:

У тебя несколько потоков — в каждом из них свой 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); // Выводит только место для картинки(рамку), хотя размеры соответствуют!?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.