2013-02-11 3 views
0

я есть файл OCX и я хочу использовать его в приложении win32, так что я change USE of MFC к USE MFC in a Static Library и я действуйте следующим образом:вызова методов ActiveX

#import "C:\\Program Files\\GeoSDK\\LiveX_8300.ocx" 
int CALLBACK WinMain(
    HINSTANCE hInstance, 
    HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, 
    int nCmdShow) 
{ 

    // Register our Window class 
    WNDCLASS wndclass; 
    wndclass.style = CS_VREDRAW | CS_HREDRAW; 
    wndclass.lpfnWndProc = &WindowProc; 
    wndclass.cbClsExtra = 0; 
    wndclass.cbWndExtra = 0; 
    wndclass.hInstance = hInstance; 
    wndclass.hIcon = NULL; 
    wndclass.hCursor = NULL; 
    wndclass.hbrBackground = reinterpret_cast <HBRUSH> (COLOR_BTNFACE + 1); 
    wndclass.lpszMenuName = NULL; 
    wndclass.lpszClassName =windowClassName; 
    ::RegisterClass(&wndclass); 

    // Create our main, raw win32 API window 
    // We create the window invisible (meaning that we do not provide WS_VISIBLE as the window style parameter), because making it visible and then 
    // adding a HwndSource will make it flicker. 
    HWND mainWindow = ::CreateWindow(
     windowClassName, 
     windowTitle, 
     0, 
     CW_USEDEFAULT, 
     CW_USEDEFAULT, 
     windowWidth, 
     windowHeight, 
     NULL, 
     NULL, 
     hInstance, 
     0); 
    ::ShowWindow (mainWindow, nCmdShow); 
    ::UpdateWindow(mainWindow); 



//ocx 
    //_DLiveX p; 

    typedef HRESULT (WINAPI *PFonc)(IUnknown*, HWND,IUnknown**); 
    HINSTANCE hDLL2 = ::LoadLibrary(TEXT("atl.dll")); 
    if (!hDLL2) 
     return 1; 

    PFonc AtlAxAttachControl = (PFonc) ::GetProcAddress(hDLL2,"AtlAxAttachControl"); 
    CLSID clsid = GetClsid(); 
    IID DIID__DLiveX = GetDIID__DLiveX(); 
    RECT rect; 
    ::GetClientRect(mainWindow,&rect); 

    container = ::CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT","",WS_CHILD | WS_VISIBLE,100,100,rect.right,rect.bottom,mainWindow,0,hInstance,0); 
AtlAxWinInit(); 

    HRESULT hr = ::CoInitialize(NULL); 

    LIVEXLib::_DLiveX *p; 
    hr = CoCreateInstance(clsid, 
        0, 
        CLSCTX_ALL, 
        DIID__DLiveX, 
        reinterpret_cast<void**>(&p)) ; 


    if(FAILED(AtlAxAttachControl((IUnknown*)p, container, 0))){ 
        p->Release(); 
        return -1; 
     MessageBox(HWND_DESKTOP, "FAILED(AtlAxAttachControl(pitd, container, NULL))", "Error", MB_ICONERROR | MB_OK); 
       } 

    while(hr == S_OK) 
     p->CreateX(); 

когда я Выполнение выражений мой прог я получил ActiveX прилагается к мой ветер, но когда я вызвать любой метод я получил эту ошибку Unhandled exception at 0x752a812f in test1.exe: Microsoft C++ exception: _com_error at memory location 0x0012fdbc.. я знаю, что я должен вызывать методы SetProperty или что-то вроде этого, но я не знаю, как

+0

Когда вы используете #import, любой отказ кода возврата HRESULT из функции COM-интерфейса преобразуется в исключение. Вы должны поймать исключение _com_error и использовать его методы, чтобы показать причину сбоя, чтобы вы могли диагностировать причину. Вы не будете знать, что не так, пока вы не добавите этот код. –

ответ

0

Поскольку вы используете MFC, используйте COleControl. Весь смысл MFC заключается в том, чтобы предоставлять классы, чтобы вам не приходилось делать все сами.

+0

Я создаю этот метод в новом классе «CLiveX»: BOOL CLiveX :: CreateX() { \t BOOL result; \t InvokeHelper (0x17, DISPATCH_METHOD, VT_BOOL, (void *) & result, NULL); \t результат возврата; } но я не использую его –

+0

Как это связано с 'COleControl'? – MSalters

+0

Это моя тайна, как я могу подключиться к COleControl из своего основного кода и вызвать методы CLiveX. –

Смежные вопросы