Как в Visual C++ 2005 сделать GetObject?

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Как в Visual C++ 2005 сделать GetObject?

Сообщение Antonariy » 19.06.2008 (Чт) 11:35

Конкретно из этого:
Код: Выделить всё
On Error Resume Next
Set obj=GetObject(, "App.Class")
If obj Is Nothing Then
    strOut = "Error"
Else
    strOut = obj.Method(strIn)
End If
должно получиться что-то вроде:
Код: Выделить всё
CString strOut="";
try{
    obj = GetObject() //еще, как првильно объявить obj?
}catch(int e){strOut = "Error"}
if(strOut=="") strOut = obj->Method(strIn);
Правильно ли все остальное? App.Class это VB6 Activex exe, метод возвращает строку.
Лучший способ понять что-то самому — объяснить это другому.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 19.06.2008 (Чт) 13:55

CComPtrBase::CoCreateInstance или где?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 19.06.2008 (Чт) 14:23

Откуда я знаю, где или кто? Знал бы - не спрашивал.
CComPtrBase::CoCreateInstance - а полностью эта строчка как должна выглядеть?
Лучший способ понять что-то самому — объяснить это другому.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 19.06.2008 (Чт) 15:37

А полностью в MSDN, как ни странно :)
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 19.06.2008 (Чт) 16:37

Antonariy
А что, и правда твой код на VB6 не возвращает все время "Error"? Или мож ты всетаки где опечатался?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 19.06.2008 (Чт) 16:59

BV
Для человека, который не знает c++ чуть больше, чем полностью (это я), MSDN бесполезен.

ANDLL
Хм, с какой стати код на VB должен выдавать Error, если приложение запущено и сделано RegisterActiveObject?
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 19.06.2008 (Чт) 17:14

Предоставлю больше конкретики.
Код: Выделить всё
HRESULT CDataPluggableProtocol::LoadDataToIStream(LPCWSTR wstrUrl)
{

   CString strUrl = wstrUrl;
   CString strFileName;

   // parse URL
   strFileName = strUrl.Right(strUrl.GetLength() - (strUrl.Find(_T("//"),0)+2));

   // open file
   HANDLE hFile = CreateFile(strFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
   _ASSERTE(INVALID_HANDLE_VALUE != hFile);

   // get file size
   DWORD dwFileSize = GetFileSize(hFile, NULL);
   _ASSERTE(-1 != dwFileSize);

   LPVOID pvData = NULL;
   // alloc memory based on file size
   HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
   _ASSERTE(NULL != hGlobal);

   pvData = GlobalLock(hGlobal);
   _ASSERTE(NULL != pvData);

   DWORD dwBytesRead = 0;
   // read file and store in global memory
   BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
   _ASSERTE(FALSE != bRead);
   GlobalUnlock(hGlobal);
   CloseHandle(hFile);

   // create IStream* from global memory
   m_pIStream.Release();
   HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &m_pIStream);
   _ASSERTE(SUCCEEDED(hr) && m_pIStream);
   if(FAILED(hr))
      return hr;

   ULARGE_INTEGER nLen;
   LARGE_INTEGER nLen1;
   nLen1.QuadPart = 0;
   if(FAILED(m_pIStream->Seek(nLen1, STREAM_SEEK_END, &nLen)))
      return E_FAIL;
   m_lSize = nLen.LowPart;
   m_lPosition = 0;
   return S_OK;
}
Нужно выкинуть все, связанное с получением данных из файла, и заменить на получение данных из метода запущенного VB6-ActiveX EXE. Метод параметром принимает url.
Лучший способ понять что-то самому — объяснить это другому.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 19.06.2008 (Чт) 18:17

Ну тогда поможет фнкция CoGetObject а не CoCreateInstance. Пример в сети мне кажеться довольно много, разве нет?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 66

    TopList