ÀÌ ¹®¼¿¡¼´Â Visual C++ 6.0 ½ÇÇà ÆÄÀÏ·Î Visual Basic ActiveX DLL¿¡ ¾×¼¼½ºÇÏ´Â 3°¡Áö ¹æ¹ýÀ» ¼³¸íÇÕ´Ï´Ù.
ÀÌ ¹®¼¿¡¼´Â Visual Basic ActiveX ±¸¼º ¿ä¼Ò¿¡ ´ëÇÑ Visual C++ Ŭ¶óÀÌ¾ðÆ® ÀÛ¼º¿¡ ´ëÇÏ¿© ¼Ò°³ÇÕ´Ï´Ù. ÀÌ¹Ì Visual C++¸¦ ´É¼÷ÇÏ°Ô ´Ù·ê ¼ö ÀÖ´Ù¸é ÂüÁ¶ Àý¿¡¼ Á» ´õ ¼öÁØ ³ôÀº ÁÖÁ¦ÀÇ ¸ñ·ÏÀ» ÂüÁ¶ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.
Visual Basic ¼¹ö¸¦ ¸¸µå´Â ´Ü°è
- Visual Basic ActiveX DLL ÇÁ·ÎÁ§Æ®¸¦ ¸¸µì´Ï´Ù. ±âº»ÀûÀ¸·Î Class1ÀÌ ¸¸µé¾îÁý´Ï´Ù.
- ¾Æ·¡ Äڵ带 Class1¿¡ Ãß°¡ÇÕ´Ï´Ù.
Public Function MyVBFunction(x As Integer) As Integer
MsgBox x
End Function
- DLLÀ» c:\Project1.dll·Î ÄÄÆÄÀÏÇϰí Visual BasicÀ» Á¾·áÇÕ´Ï´Ù.
¹æ¹ý 1 - CreateDispatch:
- Visual C++À» ½ÃÀÛÇϰí File ¸Þ´º¿¡¼ New¸¦ ¼±ÅÃÇÕ´Ï´Ù. MFC AppWizard(Exe)¿Í ÇÁ·ÎÁ§Æ® À̸§À» ¼±ÅÃÇÑ ´ÙÀ½ OK¸¦ ´©¸¨´Ï´Ù. MFC AppWizard ´ëÈ »óÀÚ°¡ ³ªÅ¸³ª¸é Finish¸¦ ´©¸¨´Ï´Ù. ´ÙÀ½¿¡ ³ªÅ¸³ª´Â ´ëÈ »óÀÚ¿¡¼ OK¸¦ ´©¸¨´Ï´Ù.
- View ¸Þ´º¿¡¼ ClassWizard¸¦ ¼±ÅÃÇϰí Class Name »óÀÚ¿¡¼ Ctst1App¸¦ ¼±ÅÃÇÑ ´ÙÀ½ Messages »óÀÚÀÇ InitInstance¸¦ µÎ ¹ø ´©¸¨´Ï´Ù. BOOL CTst1App::InitInstance()¿¡ ´ëÇÑ Äڵ带 Ç¥½ÃÇϰí, AfxEnableControlContainer() ÁÙÀ» ã°í, ±× ¾Õ¿¡ ´ÙÀ½ ÇàÀ» Ãß°¡ÇÏ·Á¸é Edit Code¸¦ ´©¸¨´Ï´Ù.
- View ¸Þ´º¿¡¼ ClassWizard¸¦ ¼±ÅÃÇϰí Automation ÅÇÀ» ´©¸¨´Ï´Ù. AddClass¸¦ ´©¸£°í "from a TypeLibrary"¸¦ ¼±ÅÃÇÕ´Ï´Ù. 3´Ü°è¿¡¼ ¸¸µç Visual Basic DLLÀÎ Project1.dllÀ» ÁöÁ¤ÇÕ´Ï´Ù. Confirm Classes ´ëÈ »óÀÚ°¡ ³ªÅ¸³ª¸é OK¸¦ ´©¸¨´Ï´Ù. OK¸¦ ´Ù½Ã ´·¯ MFC ClassWizard ´ëÈ »óÀÚ¸¦ ´Ý½À´Ï´Ù.
- <App Name>.cpp ÆÄÀÏÀ» ¿°í #include "Project1.h" ÇàÀ» Ãß°¡ÇÕ´Ï´Ù. project1.dll¿¡ ¾×¼¼½ºÇÏ´Â Äڵ尡 ÀÖÀ» ¶§¸¶´Ù Project1.h¸¦ Æ÷ÇÔ½ÃÄÑ¾ß ÇÕ´Ï´Ù.
- ClassWizard¸¦ ´Ù½Ã ¿±´Ï´Ù. Message Maps ÅÇÀÇ Class Name »óÀÚ¿¡¼ CAboutDlg¸¦ ¼±ÅÃÇϰí Object IDs »óÀÚ¿¡¼ IDOK¸¦ ¼±ÅÃÇÑ ´ÙÀ½ BN_CLICKED¸¦ µÎ ¹ø ´©¸¨´Ï´Ù. ³ªÅ¸³ª´Â ´ëÈ »óÀÚ¿¡¼ OK¸¦ ´©¸¥ ´ÙÀ½ OK¸¦ ´Ù½Ã ´·¯ ClassWizard¸¦ ´Ý½À´Ï´Ù.
- <App Name>.cpp¸¦ ¿°í ¾Æ·¡ÂÊÀ¸·Î ½ºÅ©·ÑÇÏ¿© CAboutDlg::OnOK()¸¦ ´ÙÀ½ ÄÚµå·Î ¹Ù²ß´Ï´Ù.
void CAboutDlg::OnOK()
{
short st = 2;
short st1;
_Class1 p;
p.CreateDispatch("Project1.Class1");
st1 = p.MyVBFunction(&st);
CDialog::OnOK();
}
- .exe ÆÄÀÏÀ» ÄÄÆÄÀÏÇÕ´Ï´Ù(F7 Ű).
- .exe ÆÄÀÏÀ» ½ÇÇàÇϰí Help ¸Þ´º¿¡¼ AboutÀ» ¼±ÅÃÇÕ´Ï´Ù. About »óÀÚ¿¡¼ OK¸¦ ´©¸£¸é project1.dll¿¡¼ ÁöÁ¤ÇÑ ¸Þ½ÃÁö »óÀÚ°¡ ³ªÅ¸³³´Ï´Ù. ´ëÈ »óÀÚ¸¦ ´ÝÀ¸·Á¸é Close ´ÜÃ߸¦ ´©¸¨´Ï´Ù.
¹æ¹ý 2 - #IMPORT:
- Visual C++ 6.0À» ½ÃÀÛÇϰí Win32 ÄÜ¼Ö ÀÀ¿ë ÇÁ·Î±×·¥À» ¸¸µì´Ï´Ù. "An Empty Project"¸¦ ¼±ÅÃÇϰí Finish¸¦ ´©¸¨´Ï´Ù.
- Project ¸Þ´º¿¡¼ Add to Project¸¦ °¡¸®Å°°í New¸¦ ´·¯ »õ C++ ¿øº» ÆÄÀÏÀ» ÇÁ·ÎÁ§Æ®¿¡ Ãß°¡ÇÕ´Ï´Ù. »õ ¿øº» ÆÄÀÏ¿¡ ´ÙÀ½ Äڵ带 ºÙ¿© ³Ö°í ÀúÀåÇÕ´Ï´Ù.
#include <stdio.h>
// 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();
}
- ÇÁ·ÎÁ§Æ®¸¦ ÄÄÆÄÀÏÇÏ¿© ½ÇÇàÇÕ´Ï´Ù. Project1.DLLÀÇ ¸Þ½ÃÁö »óÀÚ°¡ ³ªÅ¸³³´Ï´Ù.
#import ¸Þ¼µå´Â Win32 ÀÀ¿ë ÇÁ·Î±×·¥, ÄÜ¼Ö ÀÀ¿ë ÇÁ·Î±×·¥ ¶Ç´Â MFC¿¡¼µµ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
¹æ¹ý 3 - ¼ø¼ö COM ÀÎÅÍÆäÀ̽º
- Visual C++À» ½ÃÀÛÇϰí File ¸Þ´º¿¡¼ New¸¦ ¼±ÅÃÇÕ´Ï´Ù. MFC AppWizard(Exe)¸¦ ¼±ÅÃÇϰí tst1 ÇÁ·ÎÁ§Æ®ÀÇ À̸§À» ÁöÁ¤ÇÑ ´ÙÀ½ OK¸¦ ´©¸¨´Ï´Ù. MFC Appwizard ´ëÈ »óÀÚ°¡ ³ªÅ¸³ª¸é Dialog Based¸¦ ¼±ÅÃÇϰí Finish¸¦ ´©¸¨´Ï´Ù. ´ÙÀ½¿¡ ³ªÅ¸³ª´Â ´ëÈ »óÀÚ¿¡¼ OK¸¦ ´©¸¨´Ï´Ù.
- ±âº»ÀûÀ¸·Î Resource Editor°¡ ½ÃÀ۵˴ϴÙ. ´ëÈ »óÀÚÀÇ ÄÁÆ®·ÑÀ» ¸ðµÎ »èÁ¦ÇÏ°í ±âº» ĸ¼Ç "Button1"À» À¯ÁöÇÑ »óÅ·ΠCommand ´ÜÃ߸¦ Ãß°¡ÇÕ´Ï´Ù.
- Button1À» µÎ ¹ø ´·¯ Add Member Function ´ëÈ »óÀÚ¸¦ Ç¥½ÃÇÕ´Ï´Ù. OK¸¦ ´·¯ OnButton1À̶ó´Â À̸§À» »ç¿ëÇÕ´Ï´Ù.
- Tools ¸Þ´º¿¡¼ OLE/COM Object Viewer¸¦ ´©¸¨´Ï´Ù. File ¸Þ´º¿¡¼ View Typelib¸¦ ¼±ÅÃÇÏ°í ¾Õ¿¡¼ ¸¸µç Project1.dllÀ» ¼±ÅÃÇÕ´Ï´Ù. OpenÀ» ´·¯ ÇØ´ç DLL¿¡ ´ëÇÑ .idl ÆÄÀÏÀ» Æ÷ÇÔÇÏ´Â ITypeLib ºä¾î¸¦ Ç¥½ÃÇÕ´Ï´Ù.
- .idl ÆÄÀÏÀÇ ³»¿ë(¿À¸¥ÂÊ Ã¢ÀÇ ³»¿ë)À» Ŭ¸³º¸µå¿¡ º¹»çÇÕ´Ï´Ù. Shift ۸¦ ´©¸¥ »óÅ¿¡¼ ÇØ´ç â¿¡ ÀÖ´Â ÅØ½ºÆ®ÀÇ Ã¹ ÀÚ¿¡¼ ¸¶Áö¸· ¹®ÀÚ±îÁö ÆäÀÌÁö À̵¿Çϰųª ½ºÅ©·ÑÇÕ´Ï´Ù. Ctrl+C¸¦ ´·¯ Ç¥½ÃµÈ ÅØ½ºÆ®¸¦ Ŭ¸³º¸µå¿¡ º¹»çÇÕ´Ï´Ù.
- Visual C++ File ¸Þ´º¿¡¼ New¸¦ ´©¸¨´Ï´Ù. New ´ëÈ »óÀÚ¿¡¼ Text FileÀ» ¼±ÅÃÇϰí test1.idl ÆÄÀÏ¿¡ À̸§À» ÁöÁ¤ÇÑ ´ÙÀ½ OK¸¦ ´©¸¨´Ï´Ù.
- ºó ÅØ½ºÆ® ÆÄÀÏÀÌ ³ªÅ¸³³´Ï´Ù. Ŭ¸³º¸µåÀÇ µ¥ÀÌÅ͸¦ ÆÄÀÏ¿¡ ºÙ¿© ³Ö°í ÀúÀåÇÕ´Ï´Ù.
- Project ¸Þ´º¿¡¼ Settings¸¦ ¼±ÅÃÇÏ°í Æ®¸® ºä¿¡¼ tst1°ú ¿øº» ÆÄÀÏ ³ëµå¸¦ È®ÀåÇÑ ´ÙÀ½ test1.idlÀ» ¼±ÅÃÇÕ´Ï´Ù. MIDL ÅÇÀ» ´©¸£°í Output header file name »óÀÚ¿¡ test1.h¸¦ ÀÔ·ÂÇÑ ´ÙÀ½ OK¸¦ ´©¸¨´Ï´Ù.
- tst1Dlg.cpp¸¦ ¿°í ´ÙÀ½ ÆÄÀÏÀ» includes ¼½¼Ç¿¡ Ãß°¡ÇÕ´Ï´Ù.
#include <initguid.h>
#include "test1.h"
- View ¸Þ´º¿¡¼ ClassWizard¸¦ ´©¸£°í Class Name »óÀÚ¿¡¼ Ctst1App¸¦ ¼±ÅÃÇÑ ´ÙÀ½ Messages »óÀÚ¿¡¼ InitInstance¸¦ µÎ ¹ø ´©¸¨´Ï´Ù. Edit Code¸¦ ´·¯ ´ÙÀ½¿¡ ´ëÇÑ Äڵ带 Ç¥½ÃÇÕ´Ï´Ù.
BOOL CTst1App::InitInstance()
´ÙÀ½ ÇàÀ» ã½À´Ï´Ù.
AfxEnableControlContainer();
±× ¾Õ¿¡ ´ÙÀ½ ÇàÀ» Ãß°¡ÇÕ´Ï´Ù. - 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();
}
- .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)
¿¡ Âü¿©ÇϽñ⠹ٶø´Ï´Ù.