powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как создать объект в COM-клиенте
10 сообщений из 10, страница 1 из 1
Как создать объект в COM-клиенте
    #33167797
Фотография Big17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос такой: есть dll-ка, из которой в системе зарегистрирован COM объект. Исходников, типа .cpp, .h, .idl нету... только dll-ка...
Как в программе на C++ (VS6) создать экземпляр этого объекта? Хотелось бы пример кода...
...
Рейтинг: 0 / 0
Как создать объект в COM-клиенте
    #33167907
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Big17Вопрос такой: есть dll-ка, из которой в системе зарегистрирован COM объект. Исходников, типа .cpp, .h, .idl нету... только dll-ка...
Как в программе на C++ (VS6) создать экземпляр этого объекта? Хотелось бы пример кода...

Например, также как при использовании ADO:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
#import "C:\Program Files\Common Files\system\ado\msado15.dll" rename_namespace("ADOCG") rename("EOF", "EndOfFile")
using namespace ADOCG;
...
_ConnectionPtr m_pCn;//Указатели на интерфейсы; созданы при импорте...
_RecordsetPtr pRs;
....
 try
 {
   hr = m_pCn.CreateInstance(__uuidof(Connection)); //Создаем объект на основе 
                                     //регистрационных данных, созданных при импорте...
   if(FAILED(hr))_com_issue_error(hr);
   m_pCn->CursorLocation = adUseClient;//Устанавливаем некоторые свойства
   hr = m_pOCn->Open(_bstr_t((LPCTSTR)strConn),_bstr_t(L""),_bstr_t(L""),adConnectUnspecified);//Вызываем некоторый метод
   if(FAILED(hr))_com_issue_error(hr);
   hr = pRs.CreateInstance(__uuidof(Recordset));
   if(FAILED(hr))_com_issue_error(hr);
 }
 catch(const _com_error& e)
    {
                CString sMsg;
                sMsg.Format("Error: %s",e.ErrorMessage());
                if(e.ErrorInfo())
                        sMsg += "; Source: " + CString((LPCTSTR)e.Source()) + "; Description: " + CString((LPCTSTR)e.Description());
                //AfxMessageBox(sMsg);
			    TRACE(sMsg);
				TRACE("\r\n");
                return;
    }
...
 try
{
  pRs.Release();
  hr = m_pCn->Close();
  if(FAILED(hr))_com_issue_error(hr);
  m_pCn.Release();//Вызываем "деструктор" для удаления объекта из памяти
 }
 catch(const _com_error& e)
    {
                CString sMsg;
                sMsg.Format("Error: %s",e.ErrorMessage());
                if(e.ErrorInfo())
                        sMsg += "; Source: " + CString((LPCTSTR)e.Source()) + "; Description: " + CString((LPCTSTR)e.Description());
                //AfxMessageBox(sMsg);
			    TRACE(sMsg);
				TRACE("\r\n");
                return;
    }
...
...
Рейтинг: 0 / 0
Как создать объект в COM-клиенте
    #33167992
SeraTJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. используешь OleView (есть в тулзах студии) -- открываешь в нем свою dll, просматриваешь ее idl-ку, определяешь namespace.

2. В своей проге добавляешь строку:
#import "YourDll.dll"

using namespace some_namespace;

3. в своей проге запрашиваешь объекты-интерфейсы. Если ты используешь ATL, то тут все очень просто. Смотри функции типа CoGetClassObject и т.д. Если надо, могу добавить пример.
...
Рейтинг: 0 / 0
Как создать объект в COM-клиенте
    #33170614
Фотография Big17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да пожалуйста, если можно пример.


P.S. Как то все сложно? Нет метода проще? CoCreateInstance не подходит?
...
Рейтинг: 0 / 0
Как создать объект в COM-клиенте
    #33170731
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возьми любой пример для DirectX (их море в сети) - дашь только свой GUID своего COM.
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
Как создать объект в COM-клиенте
    #33181978
Фотография Big17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:( Увы, пример приведенный выше, не пошел... точнее, наверное, я не смог его реализовать... Хотелось бы "элементарный" пример, не перегруженный излишествами....
...
Рейтинг: 0 / 0
Как создать объект в COM-клиенте
    #33181999
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Big17:( Увы, пример приведенный выше, не пошел... точнее, наверное, я не смог его реализовать... Хотелось бы "элементарный" пример, не перегруженный излишествами....
Лови пример! Ничего лишнего. Просто использовал Визард и сделал консольное приложение с поддержкой MFC...
К исходникам программы:
Я предварительно написал на VFP класс (=СОМ-объект), который просто делает выборку из dbf-файла и завернул его в dll-ку(ws_server1.dll). А в этой программе я просто этой dll-кой пользуюсь...
Правда, предварительно ее необходимо было зарегистрировать посредством regsvr32...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
// testmyweb.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "testmyweb.h"
//Импорт описания моего класса (=СОМ-объекта)
#import "d:\VFP8_Projects\WebServices\ws_server1.dll" rename_namespace ("Webs")
using namespace Webs;

//Эта вся лабуда создана мастером
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode =  0 ;

	// initialize MFC and print and error on failure
	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(),  0 ))
	{
		// TODO: change error code to suit your needs
		cerr << _T("Fatal Error: MFC initialization failed") << endl;
		nRetCode =  1 ;
	}
	else
	{
		// TODO: code your application's behavior here.
		CString strHello;
		strHello.LoadString(IDS_HELLO);
		cout << (LPCTSTR)strHello << endl;

                 //Это уже писал я
		HRESULT hr;
		Iws_mes_serverPtr Server;
		CoInitialize(NULL);
		try{
                 //WS_MES_SERVER - имя моего класса
		hr=Server.CreateInstance(__uuidof(WS_MES_SERVER));
		if(FAILED(hr)) _com_issue_error(hr);
                 //test - метод моего класса, он делает всю работу по выборке 
                 //         информации
                 strHello=(LPCSTR)Server->test(_bstr_t("2128105")); 
		strHello.AnsiToOem();
		cout << (LPCTSTR)strHello << endl;
		Server.Release();
		}
		catch(_com_error &e)
		{
			AfxMessageBox((LPCSTR)e.ErrorMessage(),MB_OK, 0 );
		}
                CoUninitialize();
	}
	return nRetCode;
}
...
Рейтинг: 0 / 0
Как создать объект в COM-клиенте
    #33182170
Фотография Big17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... Как только подключил dll-ку импортом, компилятор стал ругаться следующим образом:


c:\projects\temp\test9\debug\c_test6_1_0.tlh(49) : error C2146: syntax error : missing ';' before identifier 'MWFlags'
c:\projects\temp\test9\debug\c_test6_1_0.tlh(49) : error C2501: 'IMWFlagsPtr' : missing storage-class or type specifiers
c:\projects\temp\test9\debug\c_test6_1_0.tlh(49) : error C2501: 'MWFlags' : missing storage-class or type specifiers
c:\projects\temp\test9\debug\c_test6_1_0.tlh(55) : error C2146: syntax error : missing ';' before identifier 'GetMWFlags'
c:\projects\temp\test9\debug\c_test6_1_0.tlh(55) : error C2501: 'IMWFlagsPtr' : missing storage-class or type specifiers
c:\projects\temp\test9\debug\c_test6_1_0.tli(14) : error C2143: syntax error : missing ';' before 'tag::id'
c:\projects\temp\test9\debug\c_test6_1_0.tli(14) : error C2433: 'IMWFlagsPtr' : 'inline' not permitted on data declarations
c:\projects\temp\test9\debug\c_test6_1_0.tli(14) : error C2501: 'IMWFlagsPtr' : missing storage-class or type specifiers
c:\projects\temp\test9\debug\c_test6_1_0.tli(14) : fatal error C1004: unexpected end of file found
...
Рейтинг: 0 / 0
Как создать объект в COM-клиенте
    #33185369
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Big17Вопрос такой: есть dll-ка, из которой в системе зарегистрирован COM объект. Исходников, типа .cpp, .h, .idl нету... только dll-ка...
Как в программе на C++ (VS6) создать экземпляр этого объекта? Хотелось бы пример кода...
рабочий только для дельфи, но код всё равно вызывает:

Код: plaintext
function CoCreateInstance;              external ole32 name 'CoCreateInstance';
типа так:

Код: plaintext
  IvarSQLXMLBL := CoCreateInstance('CLSID_COM_по названию_например_SQLXMLBulkLoad.SQLXMLBulkLoad.3.0');
использование если знаешь интерфейс:
Код: plaintext
  IvarSQLXMLBL.ErrorLogFile := 'c:\TMP';
...
Рейтинг: 0 / 0
Как создать объект в COM-клиенте
    #33189831
Фотография Big17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
Заработало через создание "обертки" с помощью Add Class... from a type library
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как создать объект в COM-клиенте
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]