title: VC++ Trasforming a sample application into a DLL
body: <p>I have a project where I received an sample code that is an exe, that basically loads to a dialog two activeX controls.</p>
  
  <p>I need to make an DLL to use the functions of that controls.</p>
  
  <p>What's the best strategy to do this?
  I think my DLL need's to make an instance of the window.
  and when the window is build get pointers to the activeX controls to make stuff happen.</p>
  
  <p>What is the best strategy to do this? or if it is even possible?</p>
  
  <p>The App Code:
  StartUp.h
      #pragma once</p>
  
  <pre><code>#ifndef __AFXWIN_H__
      #error "include 'stdafx.h' before including this file for PCH"
  #endif
  
  #include "resource.h"       // main symbols
  
  
  
  // CStartUpApp:
  // See StartUp.cpp for the implementation of this class
  //
  
  class CStartUpApp : public CWinApp
  {
  public:
      CStartUpApp();
  
  // Overrides
      public:
      virtual BOOL InitInstance();
  
  // Implementation
  
      DECLARE_MESSAGE_MAP()
  };
  
  extern CStartUpApp theApp;
  </code></pre>
  
  <p>StartUpDlg.h</p>
  
  <pre><code>#pragma once
  #include "xnssdkdevicectrl.h"
  #include "xnssdkwindowctrl.h"
  
  
  // CStartUpDlg dialog
  class CStartUpDlg : public CDialog
  {
  // Construction
  public:
      CStartUpDlg(CWnd* pParent = NULL);  // standard constructor
  
  // Dialog Data
      enum { IDD = IDD_STARTUP_DIALOG };
  
      protected:
      virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  
  
  // Implementation
  protected:
      HICON m_hIcon;
  
      // Generated message map functions
      virtual BOOL OnInitDialog();
      afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
      afx_msg void OnPaint();
      afx_msg HCURSOR OnQueryDragIcon();
      DECLARE_MESSAGE_MAP()
  
  private:
      // [ XNS ACTIVEX HELP ]
      // -----------------------------------------------------------------------
      // XNS Device control and Window control variables
      // -----------------------------------------------------------------------
      CXnssdkwindowctrl   m_ctrlXnsWindow;    // XnsWindow control
      CXnssdkdevicectrl   m_ctrlXnsDevice;    // XnsDevice control
  
  public:
      afx_msg void OnBnClickedOk();
  };
  </code></pre>
  
  <p>StartUp.cpp</p>
  
  <pre><code>#include "stdafx.h"
  #include "StartUp.h"
  #include "StartUpDlg.h"
  
  #ifdef _DEBUG
  #define new DEBUG_NEW
  #endif
  
  
  // CStartUpApp
  
  BEGIN_MESSAGE_MAP(CStartUpApp, CWinApp)
      ON_COMMAND(ID_HELP, &amp;CWinApp::OnHelp)
  END_MESSAGE_MAP()
  
  
  // CStartUpApp construction
  
  CStartUpApp::CStartUpApp()
  {
      // TODO: add construction code here,
      // Place all significant initialization in InitInstance
  }
  
  
  // The one and only CStartUpApp object
  
  CStartUpApp theApp;
  
  
  // CStartUpApp initialization
  
  BOOL CStartUpApp::InitInstance()
  {
      // InitCommonControlsEx() is required on Windows XP if an application
      // manifest specifies use of ComCtl32.dll version 6 or later to enable
      // visual styles.  Otherwise, any window creation will fail.
      INITCOMMONCONTROLSEX InitCtrls;
      InitCtrls.dwSize = sizeof(InitCtrls);
      // Set this to include all the common control classes you want to use
      // in your application.
      InitCtrls.dwICC = ICC_WIN95_CLASSES;
      InitCommonControlsEx(&amp;InitCtrls);
  
      CWinApp::InitInstance();
  
      AfxEnableControlContainer();
  
      // Standard initialization
      // If you are not using these features and wish to reduce the size
      // of your final executable, you should remove from the following
      // the specific initialization routines you do not need
      // Change the registry key under which our settings are stored
      // TODO: You should modify this string to be something appropriate
      // such as the name of your company or organization
      SetRegistryKey(_T("Local AppWizard-Generated Applications"));
  
      CStartUpDlg dlg;
      m_pMainWnd = &amp;dlg;
      INT_PTR nResponse = dlg.DoModal();
      if (nResponse == IDOK)
      {
          // TODO: Place code here to handle when the dialog is
          //  dismissed with OK
      }
      else if (nResponse == IDCANCEL)
      {
          // TODO: Place code here to handle when the dialog is
          //  dismissed with Cancel
      }
  
      // Since the dialog has been closed, return FALSE so that we exit the
      //  application, rather than start the application's message pump.
      return FALSE;
  }
  </code></pre>
  
  <p>StartUpDlg.cpp</p>
  
  <pre><code>#include "stdafx.h"
  #include "StartUp.h"
  #include "StartUpDlg.h"
  
  
  // [ XNS ACTIVEX HELP ]
  // -----------------------------------------------------------------------
  // This files are installed in {$SDK path}\sample_code\include 
  // You should include this files
  // -----------------------------------------------------------------------
  #include "XnsCommon.h"
  #include "XnsDeviceInterface.h"
  
  #ifdef _DEBUG
  #define new DEBUG_NEW
  #endif
  
  
  // Macro for OutputDebugString()
  #define DBG_LOG(...) do{\
      CString strMessage = _T("");\
      strMessage.AppendFormat(_T("(%S:%d)"), __FUNCTION__, __LINE__); \
      strMessage.AppendFormat(__VA_ARGS__);\
      OutputDebugString(strMessage);\
  }while(0);
  
  // Macro for AfxMessageBox()
  #define ERROR_BOX(...) do{\
      CString strMessage = _T("");\
      strMessage.Format(__VA_ARGS__);\
      AfxMessageBox(strMessage);\
  }while(0);
  
  
  // CAboutDlg dialog used for App About
  
  class CAboutDlg : public CDialog
  {
  public:
      CAboutDlg();
  
  // Dialog Data
      enum { IDD = IDD_ABOUTBOX };
  
      protected:
      virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  
  // Implementation
  protected:
      DECLARE_MESSAGE_MAP()
  };
  
  CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  {
  }
  
  void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  {
      CDialog::DoDataExchange(pDX);
  }
  
  BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  END_MESSAGE_MAP()
  
  
  // CStartUpDlg dialog
  
  
  
  
  CStartUpDlg::CStartUpDlg(CWnd* pParent /*=NULL*/)
      : CDialog(CStartUpDlg::IDD, pParent)
  {
      m_hIcon = AfxGetApp()-&gt;LoadIcon(IDR_MAINFRAME);
  }
  
  void CStartUpDlg::DoDataExchange(CDataExchange* pDX)
  {
      CDialog::DoDataExchange(pDX);
      DDX_Control(pDX, IDC_XNSSDKDEVICECTRL, m_ctrlXnsDevice);
      DDX_Control(pDX, IDC_XNSSDKWINDOWCTRL, m_ctrlXnsWindow);
  }
  
  BEGIN_MESSAGE_MAP(CStartUpDlg, CDialog)
      ON_WM_SYSCOMMAND()
      ON_WM_PAINT()
      ON_WM_QUERYDRAGICON()
      //}}AFX_MSG_MAP
      ON_BN_CLICKED(IDOK, &amp;CStartUpDlg::OnBnClickedOk)
  END_MESSAGE_MAP()
  
  
  // CStartUpDlg message handlers
  
  BOOL CStartUpDlg::OnInitDialog()
  {
      CDialog::OnInitDialog();
  
      // Add "About..." menu item to system menu.
  
      // IDM_ABOUTBOX must be in the system command range.
      ASSERT((IDM_ABOUTBOX &amp; 0xFFF0) == IDM_ABOUTBOX);
      ASSERT(IDM_ABOUTBOX &lt; 0xF000);
  
      CMenu* pSysMenu = GetSystemMenu(FALSE);
      if (pSysMenu != NULL)
      {
          CString strAboutMenu;
          strAboutMenu.LoadString(IDS_ABOUTBOX);
          if (!strAboutMenu.IsEmpty())
          {
              pSysMenu-&gt;AppendMenu(MF_SEPARATOR);
              pSysMenu-&gt;AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
          }
      }
  
      // Set the icon for this dialog.  The framework does this automatically
      //  when the application's main window is not a dialog
      SetIcon(m_hIcon, TRUE);         // Set big icon
      SetIcon(m_hIcon, FALSE);        // Set small icon
  
      // TODO: Add extra initialization here
  
      // [ XNS ACTIVEX HELP ]
      // -----------------------------------------------------------------------
      // Initializes the DLL files. 
      // For this, XnsActiveX library requires config.xml, device.xml, 
      // and xns.xml files and the DLL file list should be mentioned 
      // in Xns.xml file. The path of the DLL file can not exceed 512 bytes
      // in length. The XnsActiveX library searches for xns.xml using 
      // XnsSDKDevice.ocx installed in "{$SDK path}\Config" folder.
      // -----------------------------------------------------------------------
      long nRet = m_ctrlXnsDevice.Initialize();
      if (nRet != ERR_SUCCESS)
      {
          DBG_LOG(_T("XnsSdkDevice:: Initialize() fail: errno=[%d]\n"), nRet);
      }
  
      // [ XNS ACTIVEX HELP ]
      // -----------------------------------------------------------------------
      // Initializes the XnsSdkWindow control. 
      // Namely, this will specify the window handle in order to display 
      // images on the screen. 
      // -----------------------------------------------------------------------
      nRet = m_ctrlXnsWindow.Initialize(NULL, NULL);
      DBG_LOG(_T("XnsSdkWindow:: Initialize() return=[%d](%s)\n"), 
          nRet, m_ctrlXnsDevice.GetErrorString(nRet));
  
  
      return TRUE;  // return TRUE  unless you set the focus to a control
  }
  
  void CStartUpDlg::OnSysCommand(UINT nID, LPARAM lParam)
  {
      if ((nID &amp; 0xFFF0) == IDM_ABOUTBOX)
      {
          CAboutDlg dlgAbout;
          dlgAbout.DoModal();
      }
      else
      {
          CDialog::OnSysCommand(nID, lParam);
      }
  }
  
  // If you add a minimize button to your dialog, you will need the code below
  //  to draw the icon.  For MFC applications using the document/view model,
  //  this is automatically done for you by the framework.
  
  void CStartUpDlg::OnPaint()
  {
      if (IsIconic())
      {
          CPaintDC dc(this); // device context for painting
  
          SendMessage(WM_ICONERASEBKGND, reinterpret_cast&lt;WPARAM&gt;(dc.GetSafeHdc()), 0);
  
          // Center icon in client rectangle
          int cxIcon = GetSystemMetrics(SM_CXICON);
          int cyIcon = GetSystemMetrics(SM_CYICON);
          CRect rect;
          GetClientRect(&amp;rect);
          int x = (rect.Width() - cxIcon + 1) / 2;
          int y = (rect.Height() - cyIcon + 1) / 2;
  
          // Draw the icon
          dc.DrawIcon(x, y, m_hIcon);
      }
      else
      {
          CDialog::OnPaint();
      }
  }
  
  // The system calls this function to obtain the cursor to display while the user drags
  //  the minimized window.
  HCURSOR CStartUpDlg::OnQueryDragIcon()
  {
      return static_cast&lt;HCURSOR&gt;(m_hIcon);
  }
  
  
  void CStartUpDlg::OnBnClickedOk()
  {
      // TODO: Add your control notification handler code here
      OnOK();
  }
  </code></pre>
  
  <p>my dll header</p>
  
  <pre><code>__declspec(dllexport) long init();//initilize app with activeX controls in window
  __declspec(dllexport) long getDlgInstance();//get dlg handle to be able to call activeX
  __declspec(dllexport) long connect(long handle);//do stuff
  </code></pre>