c++ - VC++ 将示例应用程序转换为 DLL

标签 c++ visual-c++ dll mfc exe

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

我需要制作一个 DLL 来使用该控件的功能。

执行此操作的最佳策略是什么? 我认为我的 DLL 需要创建窗口的实例。 并在构建窗口时获取指向 activeX 控件的指针以使事情发生。

执行此操作的最佳策略是什么?或者是否有可能?

应用程序代码: 启动.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;

启动Dlg.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();
};

启动.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;
}

启动Dlg.cpp

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

我的 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 项目中获取您需要的所有代码,仅导出您想要从主机应用程序访问的功能,然后您就完成了

关于c++ - VC++ 将示例应用程序转换为 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32244846/

相关文章:

c++ - 优化器错误或未定义的行为?

c++ - Win32 编译器错误

c++ - ESP 的值未在函数调用错误中正确保存

c++ - 如何让 C++ 程序查找 DLL?

c++ - 编译 OpenGL 着色器导致语法错误

c++ - 遇到困难我的代码

c++ - 用其他预处理器命令包装#include 指令

c++ - DLL 如何处理来自多个进程的并发?

c++ - vector 中的位置值

c++ - 什么 CMake 变量用于在 XCode 中设置 C++ 标准库?