Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2012, 09:51   #11
DRFRIMEN
Пользователь
 
Регистрация: 09.10.2012
Сообщений: 15
По умолчанию

В итоге функция основного потока приобрела вид:

Код:
STDMETHODIMP Cfirst::testf(VARIANT callbackf, BSTR num, VARIANT* ret)
{	
	
	CoInitializeEx(0, COINIT_APARTMENTTHREADED);	

	IDispatch *callf = V_DISPATCH(&callbackf);

	msg_struct out_parametr;
	
	CComDispatchDriver pObj = V_DISPATCH(&callbackf);

	HRESULT hr = CoMarshalInterThreadInterfaceInStream(
		IID_IDispatch, callf, &(out_parametr.istr)); 	
	
	boost::thread thrd(f1,out_parametr);

	//ofstream f("C:\\test\\out2.txt");

	//f << "is readed";
	
	CoUninitialize();

	return S_OK;
}
А дочерний поток вот так:

Код:
DWORD __stdcall f1(msg_struct param){

	CoInitializeEx(0, COINIT_APARTMENTTHREADED);		

	IDispatch *callf = NULL;
	
	HRESULT hr = CoGetInterfaceAndReleaseStream(
		param.istr, IID_IDispatch, (void**) &callf); 
	
	CComDispatchDriver pObj = callf;

	param1 = GetCurrentTime();	

	HRESULT res = pObj.Invoke1((DISPID)DISPID_VALUE,&param1);		
	
	/*ofstream f("C:\\test\\out.txt");

	f << hex << res << " " << hr;*/

	CoUninitialize();
	
	return 0;
}
Структура msg_struct:

Код:
struct msg_struct {
	
	IStream *istr;

};
Вот как то так. Вроде работает)
DRFRIMEN вне форума Ответить с цитированием
Старый 12.10.2012, 10:35   #12
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

В основном потоке лучше не вызывать CoInitialize - это должно быть проинициализировано в браузере - всегда проверяйте HRESULT хотя бы в Debug версии
waleri вне форума Ответить с цитированием
Старый 12.10.2012, 13:07   #13
DRFRIMEN
Пользователь
 
Регистрация: 09.10.2012
Сообщений: 15
По умолчанию

HRESULT будет проверяться обязательно. Сейчас целью было заставить срабатывать Invoke. Я вообще правильно понял принцип использования маршалинга или можно как то правильнее сделать?
DRFRIMEN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Должно быть 3 потока. А диспетчер задач показывает, что потока создано 2 BEL9ILLI Общие вопросы Delphi 3 06.12.2011 20:26
Как узнать номер потока из самого потока? GaMeSTeR Помощь студентам 0 03.12.2010 09:50
вызов callback Vistar Общие вопросы .NET 9 24.10.2010 14:49
Отключение ActiveX при использовании JavaScript POPOV JavaScript, Ajax 2 02.07.2009 15:47
Callback Wolfheart Win Api 12 02.06.2007 23:13