将示例应用程序转换为DLL

VC++ Trasforming a sample application into a DLL

本文关键字:DLL 程序转换 应用      更新时间:2023-10-16

我有一个项目,我收到了一个示例代码,这是一个exe,基本上加载到一个对话框两个activeX控件。

我需要做一个DLL来使用控件的功能。

最好的策略是什么?我认为我的DLL需要创建窗口的实例。当窗口建立时,得到activeX控件的指针,使事情发生。

做到这一点的最佳策略是什么?或者这是否可能?

App Code:StartUp.h# pragma一旦

#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;

StartUpDlg.h

#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();
};

StartUp.cpp

#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, &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(&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 = &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;
}

StartUpDlg.cpp

#include "stdafx.h"
#include "StartUp.h"
#include "StartUpDlg.h"

// [ XNS ACTIVEX HELP ]
// -----------------------------------------------------------------------
// This files are installed in {$SDK path}sample_codeinclude 
// 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()->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, &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 & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);
    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        CString strAboutMenu;
        strAboutMenu.LoadString(IDS_ABOUTBOX);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->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 & 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<WPARAM>(dc.GetSafeHdc()), 0);
        // Center icon in client rectangle
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&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<HCURSOR>(m_hIcon);
}

void CStartUpDlg::OnBnClickedOk()
{
    // TODO: Add your control notification handler code here
    OnOK();
}

my DLL头文件

__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

应该不难…在没有看到代码的情况下(我怎么可能看到?),我假设您定义了将activeX控件的指针返回给调用者的函数。根据您之前提出的问题判断,您知道如何创建DLL。在新的DLL项目中获取所需的所有代码,只导出要从宿主应用程序访问的函数,然后就完成了

您的DLL代码将看起来像

__declspec (dllexport) CStartUpDlg *ShowStartUpDlg()
{   AFX_MANAGE_STATE(AfxGetStaticModuleState()); // in case the dialog is in the DLL's .rc file
    // alternate to the above line: AfxSetResourceHandle(hInstance); // hInstance is what you get in the DLL's InitInstance()
    CStartUpDlg *pDlg = new CStartUpDlg();
    if (pDlg == NULL)
        return NULL;
    if (!pDlg->Create(IDD_STARTUP_DLG))
        return NULL;
    pDlg->ShowWindow(SW_SHOW);
    return pDlg; // make sure you close the dialog and delete pDlg at the end of your program
}