加载包含控件类的dll

原创 2016年05月30日 22:50:47
将控件或窗体类包含在DLL中,然后导出函数,此函数创建控件到主窗口上。
/* @breif 加载包含控件的dll,并显示控件
*  同时在当前工程下添加控件类的.h文件
*  复制dll到当前工程下
*  日期:2016.5.30
*/
#ifndef __LOADDLL__
#define __LOADDLL__
#include <vcl.h>
#include <windows.h>

typedef  TMetaClass * (__stdcall * pCreateControl )(TApplication*,TForm*,TScreen*);

template <class T>
class  TLoadControlDll
{
    private:
       HINSTANCE   m_handle;
       pCreateControl  m_create_control_fuction;
       TMetaClass * m_pClass;

       T  * m_control;
       
    public:
       //构造函数,加载dll
       TLoadControlDll(const char * libName);
       //获取创建控件类函数
       void GetFunction(const char * functionName);
       //创建控件并显示
       void Show(TForm * m);
       
       ~TLoadControlDll();
};

template <class T>
TLoadControlDll<T>::TLoadControlDll(const char * libName)
{
    m_handle = LoadLibraryA(libName);
}

template <class T>
void TLoadControlDll<T>::GetFunction(const char * functionName)
{
    m_create_control_fuction = (pCreateControl)GetProcAddress(m_handle, functionName);
}

template <class T>
void TLoadControlDll<T>::Show(TForm * m)
{
    m_pClass = m_create_control_fuction(Application,m,Screen);
    Application->CreateForm(m_pClass, &m_control);
    m_control->Parent = m;
    m_control->Show();
}

template <class T>
TLoadControlDll<T>::~TLoadControlDll()
{
    delete m_control;
    FreeLibrary(m_handle); 
}
#endif
在主窗体中调用类,创建控件,并显示在主窗口上,代码如下:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "mainUnit1.h"
#include "loaddll.h"
#include "scalewin.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

//dll中的包含的类TMyFrame1
//通过.h文件引入
TMyFrame1 * p1;
//dll引导类
TLoadControlDll<TMyFrame1> * pCreateMainFrame;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   //调用dll中的创建控件类
   pCreateMainFrame = new TLoadControlDll<TMyFrame1>("MainFrame.dll");
   pCreateMainFrame->GetFunction("getScaleFrame");
   pCreateMainFrame->Show(this);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    delete pCreateMainFrame;
}
//---------------------------------------------------------------------------
工程需要带包编译和发行。


版权声明:本文为博主原创文章,未经博主允许不得转载。

c++显式加载dll并使用DLL的类

转载自:  http://blog.163.com/tianjunqiang666@126/blog/static/8725911920121064573594/ 首先需要强调,...
  • zerokkqq
  • zerokkqq
  • 2016年10月31日 16:22
  • 500

多个类封装dll即dll与lib

介绍: 转载:http://www.cnblogs.com/lancidie/archive/2011/03/12/1982253.html
  • xiaozz_m608c
  • xiaozz_m608c
  • 2014年09月22日 11:15
  • 1023

关于C#应用第三方控件dll的使用方法及常见问题

在引用第三方控件是需要先了解第三方所提供的方法,一个完整的引用还需要提供方给出二次开发方案。这些不用都说,对于不同项目可能用法也是不同具体问题具体分析! 第三方控件一般会与COM方式提供,我们需要导入...
  • TracyMen
  • TracyMen
  • 2016年02月18日 22:57
  • 3004

关于chrome上的网银安全控件开发技术(chrome 调用本地dll)

基于chrome、edge、Firefox等主流浏览器相继抛弃npapi和ActiveX技术,根据国内网银的使用现状,本文主要就国内网银控件升级问题进行探讨研究,打通了chrome上开发网银控件的技术...
  • handaozhengshen
  • handaozhengshen
  • 2017年07月31日 20:32
  • 961

SuperMap iObjects .NET加载dll动态库失败,控件不能用常见问题解析

初次部署使用SuperMap iObjects .NET的开发人员,可能遇到以下问题:1.环境部署不成功2.部署成功了,VS工具箱里面没有SuperMap相关控件3.工具箱里面的SuperMap相关控...
  • supermapsupport
  • supermapsupport
  • 2017年03月21日 17:03
  • 1636

动态链接库DLL的加载:隐式加载(载入时加载)和显式加载(运行时加载)

静态链接库在链接时,编译器会将 .obj 文件和 .LIB 文件组织成一个 .exe 文件,程序运行时,将全部数据加载到内存。 如果程序体积较大,功能较为复杂,那么加载到内存中的时间就会比较长,...
  • shuimanting520
  • shuimanting520
  • 2016年05月07日 07:45
  • 1700

swing嵌入ocx或dll影像控件

关于swing嵌入ocx或dll影像控件的问题,自己研究了一下,今天发出来给大家共享一下 swing调用OCX或dll的方法有很多,其中包括:jcob、comfyj、jawin、jni、jna等等很多...
  • yangyanhe
  • yangyanhe
  • 2015年12月30日 14:25
  • 1337

c++显式加载dll并使用DLL的类

转载自:  http://blog.163.com/tianjunqiang666@126/blog/static/8725911920121064573594/ 首先需要强调,当使用某...
  • xiamentingtao
  • xiamentingtao
  • 2016年04月04日 01:29
  • 4054

动态链接库(DLL)总结---从DLL中导出类(6)

我们创建一个工程动态链接库,名称为DLL1,然后在DLL1.h中添加代码如下: #ifdef DLL1_API_IMP #else #define DLL1_API_IMP __declspec...
  • oBuYiSeng
  • oBuYiSeng
  • 2015年12月01日 08:50
  • 1622

JAVA动态加载dll任意路径加载dll

package com.ctl.test; import java.io.File; import java.io.FileOutputStream; import java.io.InputStr...
  • CTLLIN
  • CTLLIN
  • 2014年06月20日 19:15
  • 12046
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:加载包含控件类的dll
举报原因:
原因补充:

(最多只允许输入30个字)