잠토의 잠망경

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

공부/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]

  1. /** 
  2.     @file 
  3.         main.cpp 
  4.     @brief 
  5.         Visual C++ 6.0 실행 파일에서 Visual Basic ActiveX DLL 액세스하는 방법 
  6.     @par 참고 Site 
  7.     http://support.microsoft.com/kb/194873 
  8.    
  9.     @author 
  10.         이원재  
  11. */  
  12.     
  13.     
  14. #include <stdio.h>  
  15.     
  16. #import "c:\\vbDll\\Project1.dll"     
  17. using namespace Project1;  
  18.     
  19.     
  20. void main()  
  21. {  
  22.     BSTR bstrDesc;  
  23.     
  24.     try  
  25.     {  
  26.         //COM 서비스를 이용하기 위해서 먼저 COM 사용할  있도록 모듈에 포함시키는 역할  
  27.         //프로그램이 시작할때 한번 호출하면됨  
  28.         //Thead에서 COM 사용하는 경우 Thread 시작부분에서 호출  
  29.     
  30.     
  31.         CoInitialize(NULL);  
  32.             
  33.         short p1    = 10;  
  34.         short p2    = 11;  
  35.     
  36.         // Declare the Interface Pointer for your Visual Basic object. Here,  
  37.         // _Class1Ptr is the Smart pointer wrapper class representing the  
  38.         // default interface of the Visual Basic object.  
  39.     
  40.         _Class1Ptr ptr1;  
  41.         _Class2Ptr ptr2;  
  42.         // vb Class1.cls 이름일때는 _Class1Ptr  
  43.         // vb Class2.cls 이름일때는 _Class2Ptr  
  44.         
  45.         // Create an instance of your Visual Basic object, here  
  46.         // __uuidof(Class1) gets the CLSID of your Visual Basic object.  
  47.     
  48.     
  49.         // Class1.cls 객체를 얻어온다.  
  50.         ptr1.CreateInstance(__uuidof(Class1));  
  51.         short ret1 = ptr1->MyFun1(&p1, &p2);  
  52.     
  53.         ret1 = ptr1->MyFunPrivate(&p1,&p2);  
  54.     
  55.         //public 객체만 접근이 가능하다.  
  56.     
  57.     
  58.     
  59.     
  60.         // Class2.cls 객체를 얻어온다.  
  61.         ptr2.CreateInstance(__uuidof(Class2));  
  62.         short ret2 = ptr2->MyFun2(&p1, &p2);  
  63.     
  64.     
  65.         // Form 직접적인 접근은 안되는  같다.  
  66.     
  67. //      Project1::_Form1Ptr ptr3;  
  68. //      ptr3.CreateInstance(__uuidof(Project1::Form1));  
  69. //      ptr3->Command1_Click();  
  70.     
  71.         // Module 접근이 안되는것 같다.  
  72. //      Project1::_ModulePtr ptr4;  
  73. //      ptr4.CreateInstance(__uuidof(Project1::_Module));  
  74. //      ptr4->MyFunModule();  
  75.     
  76.     
  77.     }  
  78.     catch(_com_error &e)  
  79.     {  
  80.         bstrDesc = e.Description();  
  81.       
  82.     }  
  83.     
  84.     // 해제하는 역할   
  85.     // 프로그램이 종료될  호출  
  86.     // Thread에서 COM 사용하는 경우 Thread 종료 부분에서 호출  
  87.     
  88.     CoUninitialize();  
  89. }  

 

Visual Basic의 Class File에만 직접적인 접근이 가능하며 다른 종류의 File 접근이 안된다.

Class File또한 Public인 method의 접근이 가능하다.

 

[Class1.cls]

  1. Option Explicit  
  2.     
  3.     
  4. Public Function MyFun1(p1 As Integer, p2 As IntegerAs Integer  
  5.     
  6.         
  7.     Call Form1.Show(vbModal)  
  8.         
  9.     'vbModeless error 발생함  
  10.     'Call Form1.Show(vbModeless)  
  11.         
  12.         
  13.         
  14.     
  15.     MyFun1 = p1 + p2  
  16.         
  17.     
  18. End Function  
  19.     
  20. Public Function MyFunPrivate(p1 As Integer, p2 As IntegerAs Integer  
  21.     
  22.     MyFunPrivate = p1 / p2  
  23.         
  24.     
  25. End Function  

 

[Class2.cls]

  1. Option Explicit  
  2.     
  3. Public Function MyFun2(p1 As Integer, p2 As IntegerAs Integer  
  4.     
  5.     MyFun2 = p1 * p2  
  6.         
  7.     
  8. End Function  

 

[Form1.frm]

  1. Option Explicit  
  2.     
  3. Public Sub Command1_Click()  
  4.     MsgBox "hithere"  
  5.         
  6. End Sub  
  7.     
  8. Public Sub Form_Load()  
  9.     MsgBox "hithere1"  
  10. 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

Comments