'Know/VC+++'에 해당되는 글 1건

  1. 2006.09.26 Visual C++ 6.0 실행 파일에서 Visual Basic ActiveX DLL에 액세스하는 방법

Visual C++ 6.0 실행 파일에서 Visual Basic ActiveX DLL에 액세스하는 방법

Know/VC+++ 2006.09.26 17:47
[출처: http://support.microsoft.com/default.aspx?scid=kb%3Bko%3B194873 ]



이 문서에서는 Visual C++ 6.0 실행 파일로 Visual Basic ActiveX DLL에 액세스하는 3가지 방법을 설명합니다.
위로 가기

추가 정보
이 문서에서는 Visual Basic ActiveX 구성 요소에 대한 Visual C++ 클라이언트 작성에 대하여 소개합니다. 이미 Visual C++를 능숙하게 다룰 수 있다면 참조 절에서 좀 더 수준 높은 주제의 목록을 참조할 수도 있습니다.


위로 가기

Visual Basic 서버를 만드는 단계


1. Visual Basic ActiveX DLL 프로젝트를 만듭니다. 기본적으로 Class1이 만들어집니다.
2. 아래 코드를 Class1에 추가합니다. Public Function MyVBFunction(x As Integer) As Integer
MsgBox x
End Function


3. DLL을 c:\Project1.dll로 컴파일하고 Visual Basic을 종료합니다.
방법 1 - CreateDispatch:

1. Visual C++을 시작하고 File 메뉴에서 New를 선택합니다. MFC AppWizard(Exe)와 프로젝트 이름을 선택한 다음 OK를 누릅니다. MFC AppWizard 대화 상자가 나타나면 Finish를 누릅니다. 다음에 나타나는 대화 상자에서 OK를 누릅니다.
2. View 메뉴에서 ClassWizard를 선택하고 Class Name 상자에서 Ctst1App를 선택한 다음 Messages 상자의 InitInstance를 두 번 누릅니다. BOOL CTst1App::InitInstance()에 대한 코드를 표시하고, AfxEnableControlContainer() 줄을 찾고, 그 앞에 다음 행을 추가하려면 Edit Code를 누릅니다. AfxOleInit();

3. View 메뉴에서 ClassWizard를 선택하고 Automation 탭을 누릅니다. AddClass를 누르고 "from a TypeLibrary"를 선택합니다. 3단계에서 만든 Visual Basic DLL인 Project1.dll을 지정합니다. Confirm Classes 대화 상자가 나타나면 OK를 누릅니다. OK를 다시 눌러 MFC ClassWizard 대화 상자를 닫습니다.
4. .cpp 파일을 열고 #include "Project1.h" 행을 추가합니다. project1.dll에 액세스하는 코드가 있을 때마다 Project1.h를 포함시켜야 합니다.
5. ClassWizard를 다시 엽니다. Message Maps 탭의 Class Name 상자에서 CAboutDlg를 선택하고 Object IDs 상자에서 IDOK를 선택한 다음 BN_CLICKED를 두 번 누릅니다. 나타나는 대화 상자에서 OK를 누른 다음 OK를 다시 눌러 ClassWizard를 닫습니다.
6. .cpp를 열고 아래쪽으로 스크롤하여 CAboutDlg::OnOK()를 다음 코드로 바꿉니다. void CAboutDlg::OnOK()
{

short st = 2;
short st1;
_Class1 p;
p.CreateDispatch("Project1.Class1");
st1 = p.MyVBFunction(&st);
CDialog::OnOK();
}


7. .exe 파일을 컴파일합니다(F7 키).
8. .exe 파일을 실행하고 Help 메뉴에서 About을 선택합니다. About 상자에서 OK를 누르면 project1.dll에서 지정한 메시지 상자가 나타납니다. 대화 상자를 닫으려면 Close 단추를 누릅니다.
방법 2 - #IMPORT:

1. Visual C++ 6.0을 시작하고 Win32 콘솔 응용 프로그램을 만듭니다. "An Empty Project"를 선택하고 Finish를 누릅니다.
2. Project 메뉴에서 Add to Project를 가리키고 New를 눌러 새 C++ 원본 파일을 프로젝트에 추가합니다. 새 원본 파일에 다음 코드를 붙여 넣고 저장합니다. #include

// This is the path for your DLL.
// Make sure that you specify the exact path.

#import "c:\project1.dll" no_namespace

void main()
{
BSTR bstrDesc;

try
{
CoInitialize(NULL);
short st = 2;
short st1;
// Declare the Interface Pointer for your Visual Basic object. Here,
// _Class1Ptr is the Smart pointer wrapper class representing the
// default interface of the Visual Basic object.

_Class1Ptr ptr;
// Create an instance of your Visual Basic object, here
// __uuidof(Class1) gets the CLSID of your Visual Basic object.

ptr.CreateInstance(__uuidof(Class1));
st1 = ptr->MyVBFunction(&st);
}
catch(_com_error &e)
{
bstrDesc = e.Description();

}
CoUninitialize();
}


3. 프로젝트를 컴파일하여 실행합니다. Project1.DLL의 메시지 상자가 나타납니다.
#import 메서드는 Win32 응용 프로그램, 콘솔 응용 프로그램 또는 MFC에서도 사용할 수 있습니다.

방법 3 - 순수 COM 인터페이스

1. Visual C++을 시작하고 File 메뉴에서 New를 선택합니다. MFC AppWizard(Exe)를 선택하고 tst1 프로젝트의 이름을 지정한 다음 OK를 누릅니다. MFC Appwizard 대화 상자가 나타나면 Dialog Based를 선택하고 Finish를 누릅니다. 다음에 나타나는 대화 상자에서 OK를 누릅니다.
2. 기본적으로 Resource Editor가 시작됩니다. 대화 상자의 컨트롤을 모두 삭제하고 기본 캡션 "Button1"을 유지한 상태로 Command 단추를 추가합니다.
3. Button1을 두 번 눌러 Add Member Function 대화 상자를 표시합니다. OK를 눌러 OnButton1이라는 이름을 사용합니다.
4. Tools 메뉴에서 OLE/COM Object Viewer를 누릅니다. File 메뉴에서 View Typelib를 선택하고 앞에서 만든 Project1.dll을 선택합니다. Open을 눌러 해당 DLL에 대한 .idl 파일을 포함하는 ITypeLib 뷰어를 표시합니다.
5. .idl 파일의 내용(오른쪽 창의 내용)을 클립보드에 복사합니다. Shift 키를 누른 상태에서 해당 창에 있는 텍스트의 첫 자에서 마지막 문자까지 페이지 이동하거나 스크롤합니다. Ctrl+C를 눌러 표시된 텍스트를 클립보드에 복사합니다.
6. Visual C++ File 메뉴에서 New를 누릅니다. New 대화 상자에서 Text File을 선택하고 test1.idl 파일에 이름을 지정한 다음 OK를 누릅니다.
7. 빈 텍스트 파일이 나타납니다. 클립보드의 데이터를 파일에 붙여 넣고 저장합니다.
8. Project 메뉴에서 Settings를 선택하고 트리 뷰에서 tst1과 원본 파일 노드를 확장한 다음 test1.idl을 선택합니다. MIDL 탭을 누르고 Output header file name 상자에 test1.h를 입력한 다음 OK를 누릅니다.
9. tst1Dlg.cpp를 열고 다음 파일을 includes 섹션에 추가합니다. #include
#include "test1.h"


10. View 메뉴에서 ClassWizard를 누르고 Class Name 상자에서 Ctst1App를 선택한 다음 Messages 상자에서 InitInstance를 두 번 누릅니다. Edit Code를 눌러 다음에 대한 코드를 표시합니다. BOOL CTst1App::InitInstance()

다음 행을 찾습니다. AfxEnableControlContainer();

그 앞에 다음 행을 추가합니다. AfxOleInit();


11. ClassWizard를 다시 엽니다. Message Maps 탭의 Class Name 상자에서 CTst1Dlg를 선택하고 Object IDs 상자에서 IDC_BUTTON1을 선택합니다. Messages 상자에서 BN_CLICKED를 두 번 누르고, Edit Code를 눌러 void CTst1Dlg::OnButton1()에 대한 코드를 표시합니다. OnButton1() 함수를 다음 코드로 바꿉니다. void CTst1Dlg::OnButton1()
{
// TODO: Add your control notification handler code here.

_Class1 *pClass = NULL;
IUnknown *pUnk = NULL;

// HRESULT hr = CoCreateInstance(CLSID_Class1,NULL,
// CLSCTX_INPROC_SERVER,IID__Class1,(void **)&pClass);
// You can directly get the Interface ID as in the previous line or
// you can do a QueryInterface on IUnknown to get the IID
// as in the following three lines:

HRESULT hr = CoCreateInstance(CLSID_Class1,NULL,CLSCTX_INPROC_SERVER,
IID_IUnknown,(void **)&pUnk);
hr = pUnk->QueryInterface(IID__Class1,(void **)&pClass);
pUnk->Release();

// Once you have the IID, you can make use of the interface pointer
// to access our Visual Basic DLL.

short st = 2;
short st1;
hr = pClass->MyVBFunction(&st,&st1);
pClass->Release();

}


12. .exe 파일을 컴파일(F7 키)하고 응용 프로그램을 실행(F5 키)합니다. 대화 상자에서 Button1을 누릅니다. Visual Basic DLL의 메시지 상자가 나타납니다.

위로 가기

참조
자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
178749 (http://support.microsoft.com/kb/178749/) MFC 및 형식 라이브러리를 사용하여 자동화 프로젝트를 만드는 방법

188817 (http://support.microsoft.com/kb/188817/) ComCallingJava 예제의 VC++ MFC 클라이언트를 만드는 방법




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹 (http://support.microsoft.com/newsgroups/default.aspx)에 참여하시기 바랍니다.
위로 가기


--------------------------------------------------------------------------------

본 문서의 정보는 다음의 제품에 적용됩니다.
• Microsoft Visual C++ 5.0 Enterprise Edition
• Microsoft Visual C++ 6.0 Enterprise Edition
• Microsoft Visual C++ 5.0 Professional Edition
• Microsoft Visual C++ 6.0 Professional Edition
• Microsoft Visual C++ 6.0 Standard Edition

위로 가기

키워드: kbinfo kbcode kbhowto KB194873

위로 가기
Trackbacks 0 : Comments 0