공부/Cpp
Visual C++ 6.0 실행 파일에서 Visual Basic ActiveX DLL에 엑세스하는 방법
잠수함토끼
2013. 1. 12. 23:34
음.. 우선.. 과제중에 제목과 같은 일을 해야할 것 같다.
아직은 유예기간인데 곧한다. ㅜㅜ
그래서 되나 안되나 함 실험해봤다.
조금 수정하거나 고민해봐야할 부분이 있지만 다음과 같은 방법을 사용하면 잘되는 것 같다.
바로 아래는 Visual C++ 6.0으로 제작된 Souce이다.
아래 Site에는 3가지 방법이 있고 그중에 맘에 드는 것으로 실행해봤다.
http://support.microsoft.com/kb/194873
[Visual C++ 6.0의 Source]
-
/**
-
@file
-
main.cpp
-
@brief
-
Visual C++ 6.0 실행 파일에서 Visual Basic ActiveX DLL에 액세스하는 방법
-
@par 참고 Site
-
http://support.microsoft.com/kb/194873
-
-
@author
-
이원재
-
*/
-
-
-
#include <stdio.h>
-
-
#import "c:\\vbDll\\Project1.dll"
-
using namespace Project1;
-
-
-
void main()
-
{
-
BSTR bstrDesc;
-
-
try
-
{
-
//COM 서비스를 이용하기 위해서 먼저 COM을 사용할 수 있도록 모듈에 포함시키는 역할
-
//프로그램이 시작할때 한번 호출하면됨
-
//Thead에서 COM을 사용하는 경우 Thread 시작부분에서 호출
-
-
-
CoInitialize(NULL);
-
-
short p1 = 10;
-
short p2 = 11;
-
-
// 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 ptr1;
-
_Class2Ptr ptr2;
-
// vb의 Class1.cls의 이름일때는 _Class1Ptr
-
// vb의 Class2.cls의 이름일때는 _Class2Ptr
-
-
// Create an instance of your Visual Basic object, here
-
// __uuidof(Class1) gets the CLSID of your Visual Basic object.
-
-
-
// Class1.cls의 객체를 얻어온다.
-
ptr1.CreateInstance(__uuidof(Class1));
-
short ret1 = ptr1->MyFun1(&p1, &p2);
-
-
ret1 = ptr1->MyFunPrivate(&p1,&p2);
-
-
//public 객체만 접근이 가능하다.
-
-
-
-
-
// Class2.cls의 객체를 얻어온다.
-
ptr2.CreateInstance(__uuidof(Class2));
-
short ret2 = ptr2->MyFun2(&p1, &p2);
-
-
-
// Form의 직접적인 접근은 안되는 것 같다.
-
-
// Project1::_Form1Ptr ptr3;
-
// ptr3.CreateInstance(__uuidof(Project1::Form1));
-
// ptr3->Command1_Click();
-
-
// Module도 접근이 안되는것 같다.
-
// Project1::_ModulePtr ptr4;
-
// ptr4.CreateInstance(__uuidof(Project1::_Module));
-
// ptr4->MyFunModule();
-
-
-
}
-
catch(_com_error &e)
-
{
-
bstrDesc = e.Description();
-
-
}
-
-
// 해제하는 역할
-
// 프로그램이 종료될 때 호출
-
// Thread에서 COM을 사용하는 경우 Thread 종료 부분에서 호출
-
-
CoUninitialize();
-
} |
Visual Basic의 Class File에만 직접적인 접근이 가능하며 다른 종류의 File 접근이 안된다.
Class File또한 Public인 method의 접근이 가능하다.
[Class1.cls]
-
Option Explicit
-
-
-
Public Function MyFun1(p1 As Integer, p2 As Integer) As Integer
-
-
-
Call Form1.Show(vbModal)
-
-
'vbModeless는 error 발생함
-
'Call Form1.Show(vbModeless)
-
-
-
-
-
MyFun1 = p1 + p2
-
-
-
End Function
-
-
Public Function MyFunPrivate(p1 As Integer, p2 As Integer) As Integer
-
-
MyFunPrivate = p1 / p2
-
-
-
End Function |
[Class2.cls]
-
Option Explicit
-
-
Public Function MyFun2(p1 As Integer, p2 As Integer) As Integer
-
-
MyFun2 = p1 * p2
-
-
-
End Function |
[Form1.frm]
-
Option Explicit
-
-
Public Sub Command1_Click()
-
MsgBox "hithere"
-
-
End Sub
-
-
Public Sub Form_Load()
-
MsgBox "hithere1"
-
End Sub |
Dll은 꼭 #import에 적어준 경로와 일치해야 Load가된다.
[참고]
아래 Site는 Visual Basic 6.0에서 ActiveX DLL 만드는 방법이 자세하게 설명되어 있다. 참고 참고 ^0^/
http://blog.naver.com/PostView.nhn?blogId=arigosoo&logNo=100164207764
vbDll.zip
VBDllTest.zip