调用DLL例子中使用LoadLibrary方法//怎么还需要DLL的头文件???

时间:2021-03-09 08:44:31

[code=c]
void CTestDllDlg::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码
    typedef CExportTest* (*lpCall)(CExportTest*);
    typedef int (*fCall)(void);
    //创建dll句柄  
    HINSTANCE hDll;  
    //装载dll  
    CExportTest* pInput = new CExportTest();
    pInput->m_i = 2;
    hDll = LoadLibrary(_T("DllInstenceMfc.dll"));  
    if(NULL==hDll)  
    {  
        AfxMessageBox(_T("DLL加载失败!"));  
    }  
    //检索指定DLL中的输出库函数地址  
    lpCall pFunc = NULL;
    fCall pFI = NULL;
    pFunc =(lpCall)GetProcAddress(hDll,(LPCSTR)"ExportClass");
    pFI = (fCall)GetProcAddress(hDll,(LPCSTR)"TestFunc");
    if(NULL==pFunc)  
    {  
        AfxMessageBox(_T("DLL内部函数调用失败!"));  
    }
    if(NULL==pFI)  
    {  
        AfxMessageBox(_T("DLL内部函数TestFunc调用失败!"));  
    }
    //创建DLL对话框  
    CExportTest* pDll = pFunc(pInput);
    if(pDll != NULL)
    {
        int i = pDll->ExportInt();        
        CString str;
        str.Format(_T("%d"),i);
        AfxMessageBox(str);
    }
    if(pFI != NULL)
    {
        int x = pFI();
        CString str;
        str.Format(_T("%d"),x);
        AfxMessageBox(str);
    }
    FreeLibrary(hDll);
    delete pInput;
}



下面代码不使用编译不过啊

#pragma once
class CExportTest
{
public:
CExportTest(void);
virtual ~CExportTest(void);
public:
virtual int ExportInt();
//virtual int ExportStr(int x) = 0;
public:
int m_i;
};

#include "StdAfx.h"
#include "ExportTest.h"


CExportTest::CExportTest(void)
{
m_i = 1;
}


CExportTest::~CExportTest(void)
{
}

int CExportTest::ExportInt(void)
{
return m_i;
}


[/code]

10 个解决方案

#1


http://blog.csdn.net/l460602540/article/details/7394593
调用dll首先要包含 头文件

你导出的是类!

#2


不包含不行啊!!!!!!!!!!!!!!!!
引用 1 楼 sha_jinhao 的回复:
http://blog.csdn.net/l460602540/article/details/7394593
调用dll首先要包含 头文件

你导出的是类!

#3


你不导出类 可以不包含!

#4


不知道 你说什么  我一个dll 封装一个类,调用DLL中提供接口函数 去访问dll 还需在调用工程里加上dll的头文件呢???
引用 3 楼 sha_jinhao 的回复:
你不导出类 可以不包含!

#5


引用 4 楼 mirroatl239 的回复:
不知道 你说什么  我一个dll 封装一个类,调用DLL中提供接口函数 去访问dll 还需在调用工程里加上dll的头文件呢???
引用 3 楼 sha_jinhao 的回复:你不导出类 可以不包含!

没DLL头文件,别人不知道导出函数的参数等是什么类型,无法方便调用

#6


必须有头文件,才能知道CExportTest是什么
否则不能出现这些语句的
typedef CExportTest* (*lpCall)(CExportTest*);
CExportTest* pInput = new CExportTest();
pInput->m_i = 2;
CExportTest* pDll = pFunc(pInput);
int i = pDll->ExportInt();

#7


dll 封装一个类,调用DLL中提供接口函数 去访问dll 原来是这么想的!靠还要导出头文件啊

引用 6 楼 stjay 的回复:
必须有头文件,才能知道CExportTest是什么
否则不能出现这些语句的
typedef CExportTest* (*lpCall)(CExportTest*);
CExportTest* pInput = new CExportTest();
pInput->m_i = 2;
CExportTest* pDll = pFunc(pInput);
int ……

#8


引用 7 楼 mirro187_ 的回复:
dll 封装一个类,调用DLL中提供接口函数 去访问dll 原来是这么想的!靠还要导出头文件啊

引用 6 楼 stjay 的回复:必须有头文件,才能知道CExportTest是什么
否则不能出现这些语句的
typedef CExportTest* (*lpCall)(CExportTest*);
CExportTest* pInput = new CExpor……


确实要,如果是一些基本数据类型就不用,如int、char等
结构体、类都需要头文件的,除非自己在内存里构造出这样的数据类型(说到底结构体、类也算是一块内存而已)

#9


引用 8 楼 stjay 的回复:
引用 7 楼 mirro187_ 的回复:dll 封装一个类,调用DLL中提供接口函数 去访问dll 原来是这么想的!靠还要导出头文件啊

引用 6 楼 stjay 的回复:必须有头文件,才能知道CExportTest是什么
否则不能出现这些语句的
typedef CExportTest* (*lpCall)(CExportTest*);
CExportTest……


可以将类封装成Handle形式
LPVOID NewCExportTest()
{
  return new CExportTest();
}

void deleteCExportTest()
{
  delete p;
}

int ExportInt(CExportTest *p)
{
    return p->m_i;
}

#10


引用 9 楼 stjay 的回复:
引用 8 楼 stjay 的回复:引用 7 楼 mirro187_ 的回复:dll 封装一个类,调用DLL中提供接口函数 去访问dll 原来是这么想的!靠还要导出头文件啊

引用 6 楼 stjay 的回复:必须有头文件,才能知道CExportTest是什么
否则不能出现这些语句的
typedef CExportTest* (*lpCall)(CExportTes……


手快了,搞错
LPVOID NewCExportTest()
{
  return new CExportTest();
}

void deleteCExportTest(LPVOID *p)
{
  delete (CExportTest*)p;
}

int ExportInt(LPVOID *p)
{
    return ((CExportTest*)p)->m_i;
}

#1


http://blog.csdn.net/l460602540/article/details/7394593
调用dll首先要包含 头文件

你导出的是类!

#2


不包含不行啊!!!!!!!!!!!!!!!!
引用 1 楼 sha_jinhao 的回复:
http://blog.csdn.net/l460602540/article/details/7394593
调用dll首先要包含 头文件

你导出的是类!

#3


你不导出类 可以不包含!

#4


不知道 你说什么  我一个dll 封装一个类,调用DLL中提供接口函数 去访问dll 还需在调用工程里加上dll的头文件呢???
引用 3 楼 sha_jinhao 的回复:
你不导出类 可以不包含!

#5


引用 4 楼 mirroatl239 的回复:
不知道 你说什么  我一个dll 封装一个类,调用DLL中提供接口函数 去访问dll 还需在调用工程里加上dll的头文件呢???
引用 3 楼 sha_jinhao 的回复:你不导出类 可以不包含!

没DLL头文件,别人不知道导出函数的参数等是什么类型,无法方便调用

#6


必须有头文件,才能知道CExportTest是什么
否则不能出现这些语句的
typedef CExportTest* (*lpCall)(CExportTest*);
CExportTest* pInput = new CExportTest();
pInput->m_i = 2;
CExportTest* pDll = pFunc(pInput);
int i = pDll->ExportInt();

#7


dll 封装一个类,调用DLL中提供接口函数 去访问dll 原来是这么想的!靠还要导出头文件啊

引用 6 楼 stjay 的回复:
必须有头文件,才能知道CExportTest是什么
否则不能出现这些语句的
typedef CExportTest* (*lpCall)(CExportTest*);
CExportTest* pInput = new CExportTest();
pInput->m_i = 2;
CExportTest* pDll = pFunc(pInput);
int ……

#8


引用 7 楼 mirro187_ 的回复:
dll 封装一个类,调用DLL中提供接口函数 去访问dll 原来是这么想的!靠还要导出头文件啊

引用 6 楼 stjay 的回复:必须有头文件,才能知道CExportTest是什么
否则不能出现这些语句的
typedef CExportTest* (*lpCall)(CExportTest*);
CExportTest* pInput = new CExpor……


确实要,如果是一些基本数据类型就不用,如int、char等
结构体、类都需要头文件的,除非自己在内存里构造出这样的数据类型(说到底结构体、类也算是一块内存而已)

#9


引用 8 楼 stjay 的回复:
引用 7 楼 mirro187_ 的回复:dll 封装一个类,调用DLL中提供接口函数 去访问dll 原来是这么想的!靠还要导出头文件啊

引用 6 楼 stjay 的回复:必须有头文件,才能知道CExportTest是什么
否则不能出现这些语句的
typedef CExportTest* (*lpCall)(CExportTest*);
CExportTest……


可以将类封装成Handle形式
LPVOID NewCExportTest()
{
  return new CExportTest();
}

void deleteCExportTest()
{
  delete p;
}

int ExportInt(CExportTest *p)
{
    return p->m_i;
}

#10


引用 9 楼 stjay 的回复:
引用 8 楼 stjay 的回复:引用 7 楼 mirro187_ 的回复:dll 封装一个类,调用DLL中提供接口函数 去访问dll 原来是这么想的!靠还要导出头文件啊

引用 6 楼 stjay 的回复:必须有头文件,才能知道CExportTest是什么
否则不能出现这些语句的
typedef CExportTest* (*lpCall)(CExportTes……


手快了,搞错
LPVOID NewCExportTest()
{
  return new CExportTest();
}

void deleteCExportTest(LPVOID *p)
{
  delete (CExportTest*)p;
}

int ExportInt(LPVOID *p)
{
    return ((CExportTest*)p)->m_i;
}