Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Фэйл при вызове методов ActiveX, что не так? трабл с StrokeScribe.ocx  
:(
    Опции темы
LShadow77
Дата 3.5.2012, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 17.10.2011

Репутация: нет
Всего: нет



Всем здравствуйте! Я абсолютный новичёк в OLE/COM/ActX, но вот в чём проблема.
Понадобилось написать прогу, которая отображает QR-код в своём окне при помощи компонента ActiveX StrokeScribe.
Всё вроде сделал по писанному, однако при вызове любого метода интерфейса StrokeScribe происходит падение приложения. Это при том, что сам StrokeScribe превосходно интегрируется, например, в 1C (т.е. рабочий). Вот ключевой код:

Код

      if FAILED(CoInitialize(0))
      {
        MessageBox(hWnd,"CoInitialize() failed!","Error",
                   MB_OK|MB_ICONERROR);
        return 0;
      };

      HRESULT hr=CoCreateInstance(CLSID_StrokeScribe,0,CLSCTX_ALL,
                      DIID__DStrokeScribe, reinterpret_cast<void**>(&pSS));
      if (FAILED(hr))
      {
        pSS=NULL;
        MessageBox(hWnd,"StrokeScribe: can't create instance!","Error",
                   MB_OK|MB_ICONERROR);
        return 0;
      };


      pSS->AboutBox();//здесь падаем!!!



Вот ссылка на оф.сайт StrokeScribe: http://strokescribe.com/
Вот полный исходник того, что пока написал:
Код


#include <windows.h>
#include <stdio.h>

#import "C:\Program Files\StrokeScribe\StrokeScribe.ocx" no_namespace named_guids

#define WIDTH  640
#define HEIGHT 480
#define APPCLS "QWERTYASDFZXCV"

#define IDC_ACT 101
#define IDC_SS  102

MSG msg;
WNDCLASSEX cls;
HINSTANCE hInst;

CHAR StrBuf[0x1000];

_DStrokeScribe* pSS=NULL;
HWND hSS;

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)
{
  hInst=hInstance;

  cls.cbSize = sizeof(WNDCLASSEX); 
  cls.style = CS_VREDRAW|CS_HREDRAW; 
  cls.lpfnWndProc = WndProc; 
  cls.cbClsExtra = 0; 
  cls.cbWndExtra = 0; 
  cls.hInstance = hInst; 
  cls.hIcon = LoadIcon(0,IDI_APPLICATION); 
  cls.hCursor = LoadCursor(0,IDC_ARROW); 
  cls.hbrBackground = (HBRUSH)GetSysColorBrush(COLOR_BTNFACE);
  cls.lpszMenuName = 0; 
  cls.lpszClassName = APPCLS; 
  cls.hIconSm;

  if (!RegisterClassEx(&cls))
  {
    wsprintf(StrBuf,"RegisterClassEx() failed!\nLastError=%u",
             GetLastError());
    MessageBox(0,StrBuf,"ERROR",MB_OK|MB_ICONERROR);
    return 1;
  };

  int x=(GetSystemMetrics(SM_CXSCREEN)-WIDTH)>>1;
  int y=(GetSystemMetrics(SM_CYSCREEN)-HEIGHT)>>1;

  HWND hWnd=CreateWindowEx(0,APPCLS,"QRTest",
                           WS_VISIBLE|WS_SYSMENU,
                           x,y,WIDTH,HEIGHT,
                           0,0,hInst,0);
  if (!hWnd)
  {
    wsprintf(StrBuf,"CreateWindowEx() failed!\nLastError=%u",
             GetLastError());
    MessageBox(0,StrBuf,"ERROR",MB_OK|MB_ICONERROR);
    return 1;
  };

  ShowWindow(hWnd,SW_SHOWNORMAL);
  UpdateWindow(hWnd);

  while (GetMessage(&msg,NULL,0,0))
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  };

  return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
  RECT ClientRC;
  HWND hActBtn;
  
  switch (uMsg)
  {
    case WM_CREATE:
    {
      GetClientRect(hWnd,&ClientRC);
      int ActBtnX=(ClientRC.right-WIDTH*2/3)>>1;
      int ActBtnY=ClientRC.bottom-(ActBtnX<<1)/3;
      hActBtn=CreateWindowEx(0,"BUTTON","Action!",
                           WS_CHILD|WS_VISIBLE,
                           ActBtnX,ActBtnY,WIDTH*2/3,30,
                           hWnd,(HMENU)IDC_ACT,hInst,0);
      if (!hActBtn) return(-1);

      if FAILED(CoInitialize(0))
      {
        MessageBox(hWnd,"CoInitialize() failed!","Error",
                   MB_OK|MB_ICONERROR);
        return 0;
      };

      HRESULT hr=CoCreateInstance(CLSID_StrokeScribe,0,CLSCTX_ALL,
                      DIID__DStrokeScribe, reinterpret_cast<void**>(&pSS));
      if (FAILED(hr))
      {
        pSS=NULL;
        MessageBox(hWnd,"StrokeScribe: can't create instance!","Error",
                   MB_OK|MB_ICONERROR);
        return 0;
      };


      pSS->AboutBox();//здесь падаем!!!


      int ssSize=ActBtnY-20;
      int ssX=(ClientRC.right-ssSize)/2;
      hSS=CreateWindowEx(0,"StrokeScribe Control","StrokeScribe",
                         WS_CHILD|WS_VISIBLE,
                         ssX,10,ssSize,ssSize,
                         hWnd,(HMENU)IDC_SS,hInst,0);

      if(!hSS)
      {
        MessageBox(hWnd,"StrokeScribe: can't create control!","Error",
                   MB_OK|MB_ICONERROR);
        return 0;
      };
      //SendMessage(hSS,AX_INPLACE,1,0);

      return 0;
    };
    case WM_COMMAND:
    {
      if (HIWORD(wParam)==BN_CLICKED)
      {
        int nCmd=LOWORD(wParam);
        if (nCmd==IDC_ACT)
        {
          MessageBox(hWnd,"QWERTY","ASDF",MB_OK);//////////////////
        };
      };
      return 0;
    };
    case WM_KEYDOWN:
    {
      if (wParam==VK_ESCAPE) goto Shutdown;
      return 0;
    };
    case WM_DESTROY:
    {
      Shutdown:
      if (hSS)
      {
        DestroyWindow(hSS);
        //hSS=NULL;
      };
      if (pSS)
      {
        pSS->Release();
        //pSS=NULL;
      };
      CoUninitialize();

      PostQuitMessage(0);
      return 0;
    };
    default:
    {
      return DefWindowProc(hWnd,uMsg,wParam,lParam);
    };
  };
}



Компилил вручную так:
Код

cl RunSS.cpp /I"C:\Program Files\Microsoft Visual Studio 10.0\VC\include" /link /SUBSYSTEM:WINDOWS /LIBPATH:"C:\Program Files\Microsoft Visual Studio 10.0\VC\LIB" kernel32.lib user32.lib gdi32.lib


Помогите пожалуйста разобраться, чего я всё-таки не учёл.


Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  RunSS.cpp 4,12 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0657 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.