1 dll工程的创建
1.1 新建一个 空 Dll工程名称为“ParameterBindingsDLL”
1.2 所属工程类别: Win32 Dynamic-Link Library
1.3 添加头文件Business.h 、export.h
1.4 添加实现文件export.cpp
1.5 对应文件源代码
1.5.1 Business.h
#pragma once
#include <stdio.h>
class CBusiness
{
public:
CBusiness(){};
virtual ~CBusiness(){};
public:
virtual void Run()=0;
public:
void RunLbm(char *pCA)
{
Run();
}
};
class CSimulateAcctQuery:public CBusiness
{
public:
CSimulateAcctQuery()
{
}
~CSimulateAcctQuery()
{
}
public:
virtual void Run()
{
printf("hehe\n");
}
protected:
private:
};
class CSimulateWinrate:public CBusiness
{
public:
CSimulateWinrate()
{
}
~CSimulateWinrate()
{
}
public:
virtual void Run(){};
public:
void SimulateWinrate(char *pCA)
{
printf("haha\n");
}
protected:
private:
};
1.5.2 export.h
#pragma once
#include "Business.h"
/************************************************************************/
/* win32 Dynamic-Linkry */
/************************************************************************/
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif // __cplusplus
#endif // NULL
#define EXPORT_LBM_FUNC(EXPORT_FUNC) \
__declspec(dllexport) void* EXPORT_FUNC(char *pCA);
#define LBM_IMPLEMENT(LBM_CLASS, EXPORT_FUNC) \
void* EXPORT_FUNC(char *pCA) \
{ \
LBM_CLASS BusObj; \
BusObj.RunLbm(pCA); \
return NULL; \
}
#define LBM_IMPLEMENT_EXT(LBM_CLASS, EXPORT_FUNC) \
void* EXPORT_FUNC(char *pCA) \
{ \
LBM_CLASS BusObj; \
BusObj.EXPORT_FUNC(pCA); \
return NULL; \
}
#ifdef __cplusplus
extern "C"
{
EXPORT_LBM_FUNC(SimulateAcctQuery)
EXPORT_LBM_FUNC(SimulateWinrate)
}
#endif // __cplusplus
1.5.3 export.cpp
#include "export.h"
LBM_IMPLEMENT(CSimulateAcctQuery,SimulateAcctQuery)
LBM_IMPLEMENT_EXT(CSimulateWinrate,SimulateWinrate)
2 调用dll工程的创建
2.1 新建一个 空 Dll工程名称为“CallParameterBindingsDLL”
2.2 所属工程类别: Win32 console Application
2.3 添加实现文件CallParameterBindingsDLL.cpp
2.4 对应文件源代码
2.4.1 CallParameterBindingsDLL.cpp
#include <stdio.h>
#include <windows.h>
void MyloadDLL1();
void MyloadDLL2();
int main()
{
MyloadDLL1();
MyloadDLL2();
getchar();
return 0;
}
/*===================================================================
* 函数名称: $ LoadDLL $
* 函数功能: 调用本地自己生成的dll文件中的某些功能SimulateAcctQuery
* 函数入参: 无
* 函数出参: 无
* 函数作者: $ xzm $
* 函数日期: $ 2014-07-24 $
* 修改记录: 无
/*==================================================================*/
void MyloadDLL1()
{
//加载动态连接库。
HMODULE hDllLib = LoadLibrary("ParameterBindingsDLL.dll");
if (hDllLib)
{
// 定义函数指针
typedef int (WINAPI *PFUNC)(); // #define WINAPI __stdcall
// 获取动态连接库里的函数地址。
PFUNC fpFun = GetProcAddress(hDllLib,"SimulateAcctQuery");
//调用函数运行。
fpFun();
//释放动态连接库。
FreeLibrary(hDllLib);
}
}
/*===================================================================
* 函数名称: $ LoadDLL $
* 函数功能: 调用本地自己生成的dll文件中的某些功能SimulateWinrate
* 函数入参: 无
* 函数出参: 无
* 函数作者: $ xzm $
* 函数日期: $ 2014-07-24 $
* 修改记录: 无
/*==================================================================*/
void MyloadDLL2()
{
//加载动态连接库。
HMODULE hDllLib = LoadLibrary("ParameterBindingsDLL.dll");
if (hDllLib)
{
// 定义函数指针
typedef int (WINAPI *PFUNC)(); // #define WINAPI __stdcall
// 获取动态连接库里的函数地址。
PFUNC fpFun = GetProcAddress(hDllLib,"SimulateWinrate");
//调用函数运行。
fpFun();
//释放动态连接库。
FreeLibrary(hDllLib);
}
}
/*===================================================================
* 函数名称: $ TestLoadDLL $
* 函数功能: 加载动态连接库,为其他加载动态链接库的功能提供了一个途径
* 函数入参: void
* 函数出参: void
* 函数作者: $ 蔡军生 $
* 函数日期: $ 2007/12/03 $
* 修改记录: 无
/*==================================================================*/
void TestLoadDLL(void)
{
//加载动态连接库。
HMODULE hDllLib = LoadLibrary("Kernel32.dll");
if (hDllLib)
{
//获取动态连接库里的函数地址。
FARPROC fpFun = GetProcAddress(hDllLib,"GetVersion");
//调用函数运行。
DWORD dwVersion = (*fpFun)();
//获取WINDOWS的版本。
DWORD dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
DWORD dwWindowsMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));
//显示。
const int nBufSize = 512;
TCHAR chBuf[nBufSize];
ZeroMemory(chBuf,nBufSize);
wsprintf(chBuf,"显示版本:%d,%d\r\n",dwWindowsMajorVersion,dwWindowsMinorVersion);
OutputDebugString(chBuf);
//释放动态连接库。
FreeLibrary(hDllLib);
}
}
2.5执行结果
3 关于两个工程的设置问题
3.1 对于ParameterBindingsDLL工程进行如下设置
工程-设置-常规-输出文件下改成如下内容: ../Bin
3.2 对于CallParameterBindingsDLL工程进行如下设置
工程-设置-常规-输出文件下改成如下内容: ../Bin
如下图
3.3 ParameterBindingsDLL工程调试加载宿主程序设置
3.4 整个项目在调试的时候,在CallParameterBindingsDLL中启动调试就行,前提是必须两个工程的.pdb文件要存在,至于为什么?你哪来的那么多为什么?
4 关于主工程中不用回调函数指针可不可以的问题
4.1在宿主工程代码中 定义的函数指针应该是 回调函数的指针 不应该是普通函数的指针
typedef int (*PFUNC)(); // 普通函数指针
typedef int (WINAPI *PFUNC)(); // 回调函数指针
4.2几个系统级别的回调函数指针
|