C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Теперь вопрос посложнее, ActiveX на апи
StaC++
Отправлено: 07.08.2005, 20:26


Не зарегистрирован







Вот такой кусок кода: (хочу создать БД с помощью ADO)
CODE

  IUnknown* pUnk;
  hr = pCF->CreateInstance( NULL, IID_IUnknown, (void**) &pUnk );
  pCF->Release();
  if ( FAILED( hr ))
  {
     cout.setf( ios::hex, ios::basefield );
     cout << "Failed to create server instance. HR = " << hr << endl;
     return -1;
  }

  cout << "Instance created" << endl;

  IDispatch* pDisp = NULL;
  hr = pUnk->QueryInterface( IID_IDispatch, (LPVOID*)&pDisp );
  pUnk->Release();

  if ( FAILED( hr ))
  {
     cout << "QueryInterface() for IDispatch failed" << endl;
     return -1;
  }
  DISPID dispid;
  DISPPARAMS dispparams;
  VARIANT value, Connection;
  OLECHAR* name = OLESTR("Create");
  BSTR arg = BSTR("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\Database\\db1.mdb");
  hr = pDisp->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
  if(FAILED(hr))
  {
    cout << "GetIDsOfNames() for IDispatch failed" << endl;
     return -1;
  }
  dispparams.rgvarg[0].bstrVal = arg;
  dispparams.rgvarg[1].pvarVal = &Connection;
  dispparams.cArgs = 2;
  dispparams.cNamedArgs = 0;
  dispparams.rgdispidNamedArgs = 0;
  hr = pDisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD,  &dispparams, &value, NULL, NULL);
  if(FAILED(hr))
  {
     cout << "Invoke() for IDispatch failed" << endl;
     return -1;
  }
  pDisp->Release();
  CoUninitialize();
  return 0;

все прекрасно работает до самого главного, т. е. dispid метода Create получаю, а вот инвоке не работает, можь кто подскажет, что не так?
Самому себе
Отправлено: 08.08.2005, 18:32


Не зарегистрирован







Всё я разобрался, для тех кто полюбопытствовал хотя б, поясню чтоп вызвать invoke() неоходимо создать dispparams.rgvarg = new VARIANTARG(n), где n — количество параметров, а то как же записыват в память и не объявить её smile.gif, вот так вот на ошибках и учусь. Ладно, спасибо все за внимание. Жаль, что активности на этом форуме мало а так сайт весьма приличный. Вё, пошёл в MSDN online << endl;

Вернуться в Технологии COM/DCOM, ActiveX