COM DLL만으로 tlb파일 생성및 COM사용하기

출처 : http://thepassion.tistory.com/22

1. visual studio도구의 OLE View나 실행>oleview를 실행해서 oleviewer를 실행시킨다.
2. File>View TypeLib메뉴를 선택해 해당 COM dll혹은 COM exe를 Open한다.
3. 디스플레이되는 정보에서 Root로 표시되는 XXX(xxx x.x Type Library)를 클릭하면 오른쪽 윈도우에 idl파일을 생성해서 보여준다.
4. 해당 내용을 xxx.idl로 저장한다.
5. *.tlb파일 생성하기
방법1)
– Win32 Dynamic Linked Library프로젝트 생성해 빈프로젝트를 만든다.
– 4항 에서 저장한 idl파일을 프로젝트에 포함한후 Build하면 *.tlb파일이 생성된다.
*** VC++의 Project>setting>midl탭에 MkTypLib commpatible항목이 체크되어있어야 한다.
방법2)
– 명령프롬프트 창에서 다음과 같이 입력해 tlb파일을 생성한다.
– C:\>midl /mktyplib203 xxx.idl
6. 해당 Com을 사용해야 하는 프로젝트에 tlb파일을 import한다.
방법1)
1)
#import “xxx.tlb”를 추가후 컴파일하면 xxx.tlh파일이 생성된다.…

VC에서 원격 데이터 객체 호출하는 방법

IDispatch* CreateConnection(LPCTSTR strAddr)
{
#ifdef UNICODE
LPTSTR strAddress = strAddr;
#else
size_t sl = strlen(strAddr);
LPWSTR strAddress = new WCHAR[sl+1];
strAddress[sl] = 0;
mbstowcs(strAddress, strAddr, sl);
#endif

IDispatch* pDispatch = NULL;
bool ok = false;
RDS::IDataspacePtr pDS;
if (SUCCEEDED(pDS.CreateInstance(OLESTR("RDS.DataSpace"))))
{
_variant_t Result;

try
{
Result = pDS->CreateObject(_bstr_t("Component.bizCOM"), _bstr_t(strAddress));
HRESULT hr = Result.pdispVal->QueryInterface(_uuidof(IDispatch), (LPVOID*) &pDispatch);

WriteLog(_T("CreateConnection :: HR = %x, IDispatch = %p"), hr, pDispatch);
}
catch(_com_error& e)
{
WriteLog(_T("CreateConnection :: exception. [%s]"), e.ErrorMessage());
}
}

#ifndef _UNICODE
delete strAddress;
#endif
return pDispatch;
}

virtual bool WINAPI Test()
{
bool ok = false;
try
{
IDispatch *pConn = CreateConnection(m_strTarget);

if(pConn != 

VB의 자동화 사용

후기바인딩 사용

Dim obj as Object
Set obj = CreateObject("AddBack.AddBack.1")
obj.Prop = propVaue
obj.Method

초기바인딩 사용

Dim obj As AddBack
Set obj = New AddBack
obj.someMethod

첫번째 문장이 실행되어 Visual Basic 함수인 CreateObject가 호출될 때 Visual Basic은 COM 라이브러리의 CLSIDFromProgID 함수를 호출하여 CreateObject 함수의 매개변수에 지정된 ProgID를 대응되는 CLSID로 변환한 후, 다시 CoCreateInstance 함수를 호출하여 자동화 객체 인스턴스를 생성하고 IDispatch 인터페이스 포인터를 Visual Basic의 obj라고 하는 객체 변수에 저장한다.

출처 : Component Development with Visual C++ & ATL

구성요소 서비스의 내 컴퓨터 기본 DCOM 통신 속성 변경하기

참고 :
http://msdn2.microsoft.com/en-us/library/ms687763(VS.85).aspx
http://msdn2.microsoft.com/en-us/library/ms682790(VS.85).aspx

기본 속성 읽어오기

try
{
ICOMAdminCatalogPtr spCatalog(_T("COMAdmin.COMAdminCatalog"));
spCatalog->Connect(_T("localhost"));

ICatalogCollectionPtr spCatalogCollection =
(ICatalogCollectionPtr)spCatalog->GetCollection(_T("LocalComputer"));
spCatalogCollection->Populate();

long nCount = 0;
nCount = spCatalogCollection->Count;
if (nCount == 0)
{
AfxMessageBox(_T("내 컴퓨터의 DCOM 통신 속성을 읽어오지 못하였습니다."));
return;
}

ASSERT(nCount == 1);

ICatalogObjectPtr spCatalogObject;
spCatalogCollection->get_Item(0, (IDispatch**)&spCatalogObject);

_variant_t value;
spCatalogObject->get_Value(_T("DefaultAuthenticationLevel"), &value);
if (value.vt == VT_I4)
{
if (value.lVal >= 0 && value.lVal <= 6) { CComboBox* pAuthCombo = (CComboBox*)GetDlgItem(IDC_CBO_AUTH); pAuthCombo->SetCurSel(value.lVal);
}
}

spCatalogObject->get_Value(_T("DefaultImpersonationLevel"), &value);
if (value.vt == VT_I4)
{
if (value.lVal >= 1 && value.lVal <= 4) { CComboBox* pImpersonationCombo = (CComboBox*)GetDlgItem(IDC_CBO_IMPERSONATION); pImpersonationCombo->SetCurSel(value.lVal);
}
}
} catch (_com_error& e) {
AfxMessageBox(e.Description());
}

ATL ActiveX 에서 실행시 보안 팝업창 없애는 법

이 글은 브라우저 상단에 뜨는 ActiveX 경고창이 아닌 ActiveX 스크립트 실행중에 별도로 뜨는 ActiveX 스크립트 경고 팝업창을 없애는 방법을 말한다.(아래그림)

컨트롤이 스크립팅에 대해 안전함을 표시

Internet Explorer에서 컨트롤이 있는 웹 페이지를 볼 수 있으며 보다 편리하게 Visual C++ .NET에 빌드된 웹 브라우저 뷰를 사용할 수 있습니다. 웹 브라우저 뷰에서 컨트롤을 보려면 마우스 오른쪽 단추로 PolyCtl.htm을 클릭하고 브라우저에서 보기를 클릭합니다.

현재의 Internet Explorer 보안 설정에 따라 컨트롤이 스크립트에 대해 안전하지 않고 잠재적으로 손상을 입힐 수도 있다고 표시된 보안 경고 대화 상자가 나타납니다. 예를 들어 파일을 표시하는 기능이 있고 파일을 삭제하는 삭제 메서드도 포함된 컨트롤은 페이지에서 표시되기만 할 때는 안전합니다. 그러나 이 …

IWebBrowser2와 IHTMLDocument2의 상호변환

1. IWebBrowser2 에서 IHTMLDocument2 인터페이스 구하기

IWebBrowser2 *m_pWebFromUnknown;
IWebBrowser2 *m_pWebFromDoc;

STDMETHODIMP CTestObj::SetSite( IUnknown *pUnkSite )
{
    IOleClientSite *pClientSite;
    HRESULT hr;

    hr = pUnkSite-> QueryInterface( IID_IOleClientSite, 
    (LPVOID *)&pClientSite );
    if ( FAILED( hr ) ) return S_OK;

    IOleContainer *pContainer;
    hr = pClientSite-> GetContainer( &pContainer );
    pClientSite-> Release();
    if ( FAILED( hr ) ) return S_OK;
    
    IServiceProvider *pServiceProvider;
    hr = pContainer-> QueryInterface( IID_IServiceProvider, 
    (LPVOID *)&pServiceProvider );
    pContainer-> Release();
    if ( FAILED( hr ) ) return S_OK;

    hr = pServiceProvider-> QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, (LPVOID *)
                                         &m_pWebFromUnknown );
    pServiceProvider-> Release();
    if ( FAILED( hr ) ) return S_OK;

    LPDISPATCH pDocDisp;
    hr = m_pWebFromUnknown-> get_Document( &pDocDisp