![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Jan 2009
Сообщений: 4
|
пытаюсь создать элемент ShockwaveFlash.ShockwaveFlash. подскажите пожалуйста в чем может быть ошибка.
в WinMain вызываю AtlAxWinInit (), дальше создаю окно и в обработчике WM_CREATE делаю такой вызов: CreateWindowEx (0, TEXT("AtlAxWin"), TEXT("ShockwaveFlash.ShockwaveFlash"), WS_CHILD | WS_TABSTOP | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, wWindow, 0, wInstance, 0) где wWindow был передан WinProc, а wInstance - WinMain. функция завершается с ошибкой 6 - invalid handle. что я забыл сделать ? ps ShockwaveFlash в com object viewer-е есть. |
|
|||||
|
listener
|
Для того, чтобы динамически хостить различные ActiveX с помощью библиотеки ATL MSDN рекомендует пользоваться классом AtlAxWin80. Вот вариант его использования под MSVC++ 2005:
#define _ATL_APARTMENT_THREADED
#include <atlbase.h>
#include <atlwin.h>
#include <atlhost.h>
#define ATL_MIN_CRT
class CHostActiveXModule : public CAtlExeModuleT<CHostActiveXModule>
{
public :
CAxWindow m_wndMain;
// Create the Main window
HRESULT PreMessageLoop(int nCmdShow)
{
HRESULT hr = CAtlExeModuleT<CHostActiveXModule>::PreMessageLoop(nCmdShow);
if (SUCCEEDED(hr))
{
AtlAxWinInit();
hr = S_OK;
RECT rc;
rc.top = rc.left = 100;
rc.bottom = rc.right = 500;
m_wndMain.Create(NULL, rc, _T("ShockwaveFlash.ShockwaveFlash"),WS_OVERLAPPEDWINDOW );
//m_wndMain.Create(NULL, rc, _T("c:\\myMovie.swf"),WS_OVERLAPPEDWINDOW );
m_wndMain.ShowWindow(nCmdShow);
}
return hr;
}
// Clean up. App is exiting.
HRESULT PostMessageLoop()
{
AtlAxWinTerm();
return CAtlExeModuleT<CHostActiveXModule>::PostMessageLoop();
}
};
CHostActiveXModule _AtlModule;
int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
UNREFERENCED_PARAMETER(hInstance);
UNREFERENCED_PARAMETER(hPrevInstance);
return _AtlModule.WinMain(nCmdShow);
}
По вашему примеру: зачем указан стиль WS_CHILD? wWindow - по смыслу хэндл родительского окна либо NULL, если окно самостоятельное. Ведь класс AtlAxWin - лишь окно-контейнер для контрола. wInstance - хэндл инстанса приложения, типа не WinMain а один из передаваемых ей параметров, либо просто GetModuleHandle(NULL); Последний раз редактировалось alexcon314; 24.01.2009 в 19:34. |
|
|||||
|
Регистрация: Jan 2009
Сообщений: 4
|
спасибо большое за пример, сейчас попробую.
Цитата:
Цитата:
если не сложно, можете дать ссылку на к-н описание или сказать, что вводить в гугл ?) |
|
|||||
|
listener
|
ссылка по #import
или в гугл "#import c++" |
|
|||||
|
Регистрация: Jan 2009
Сообщений: 4
|
м-да, глупый вопрос. спасибо. а я использовал midl для этого.
странно, вроде работает wnd.Create(0, rect, _T("ShockwaveFlash.ShockwaveFlash"), WS_VISIBLE ); а CreateWindowEx - нет. спасибо за наводку. пойду учить atl >использовал midl ну в смысле сохранял ole-com object viewer-ом в idl сначала Последний раз редактировалось kaj; 24.01.2009 в 23:33. |
|
|||||
|
listener
|
#include <windows.h>
int WINAPI WinMain(HINSTANCE inst,HINSTANCE prev,LPSTR cmd,int show) {
MSG msg={0};
void* init = GetProcAddress(LoadLibraryA("atl"),"AtlAxWinInit");
_asm call init;
CreateWindowA(
"AtlAxWin",
"c:\\WINDOWS\\Help\\Tours\\mmTour\\segment2.swf",
WS_VISIBLE|WS_POPUP,
0,
0,
GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN),
0,
0,
0,
0);
while (GetMessage(&msg,0,0,0)) DispatchMessage(&msg);
};
откуда взял. Последний раз редактировалось alexcon314; 30.01.2009 в 12:38. |
|
|||||
|
Регистрация: Jan 2009
Сообщений: 4
|
спасибо, да, его смотрел, но в атл из .net как раз так у меня не получается - т.е. с помощью CreateWindow. в vc 6 все работает. слышал, что AtlAxWin изменилось на AtlAxWin7, но это не помогает, видимо изменилось и еще что-то. но ваш пример с CAxWindow работает - в нем наверное учитываются эти изменения.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 20:13. |
|
|
« Предыдущая тема | Следующая тема » |
|
|