Windows下使用Dev C++ 编写dll与使用dll(二)C++项目下的dll

Windows下使用Dev C++ 编写dll与使用dll(二)C++项目下的dll

使用Dev c++,新建一个c++项目的dll项目。

还是会自动生成两个文件,只是这里不是.c文件,而是.cpp了。

这里,为了测试,我们分别在cpp与h文件中像之前C项目一样,添加一个HelloWorld函数,与一个add函数。

其他的,我们先啥也不管。直接编译运行。

代码如下:

/* Replace "dll.h" with the name of your header */

#include "dll.h"

#include

DllClass::DllClass()

{

}

DllClass::~DllClass()

{

}

void DllClass::HelloWorld()

{

MessageBox(0, "Hello World from DLL!\n","Hi",MB_ICONINFORMATION);

}

DLLIMPORT void HelloWorld()

{

MessageBox(0, "Hello World from DLL!\n","Hi",MB_ICONINFORMATION);

}

DLLIMPORT int add(int a,int b)

{

return a+b;

}

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)

{

switch(fdwReason)

{

case DLL_PROCESS_ATTACH:

{

break;

}

case DLL_PROCESS_DETACH:

{

break;

}

case DLL_THREAD_ATTACH:

{

break;

}

case DLL_THREAD_DETACH:

{

break;

}

}

/* Return TRUE on success, FALSE on failure */

return TRUE;

}

#ifndef _DLL_H_

#define _DLL_H_

#if BUILDING_DLL

#define DLLIMPORT __declspec(dllexport)

#else

#define DLLIMPORT __declspec(dllimport)

#endif

class DLLIMPORT DllClass

{

public:

DllClass();

virtual ~DllClass();

void HelloWorld();

};

DLLIMPORT void HelloWorld();

DLLIMPORT int add(int,int);

#endif

编译运行,打开文件夹,查看。

生成了dll_demo.dll。我们还是像之前一样,使用test.cpp来引入这个dll中的函数。

dll调用成功,但是居然没有弹出一个MessageBox。哪里有问题呢?

再来看看add函数。

仍然是调用成功,运行卡顿,而且返回非0数值,也却无法调用add函数,这是为什么呢。

依照本人粗浅的理解:大体就是c++项目生成的dll,会重新给函数、类命名。

具体可以看刚才文件夹下的.def文件。我们打开看看。(以打开文本方式打开即可,这里安利一款非常好用的空格预览工具QuickLook,选择文件,按下空格,即可预览)

这是这个dll的导出表,很明显,并没有单独的add。

实际上,之前C项目生成dll文件也是有这个文件的,大家可以自行对比,只是C项目生成dll不会导致函数重命名,就不做详叙。

这里可见,HelloWorld函数已经重命名为“_Z10HelloWorldv”。我们还是在test.cpp中试试。

点击确定,程序便返回正常的0了。

那么,如何才能不让函数名发生变化呢?如下:

我们同时改动这两个文件,cpp文件,随便删除分号,再填上就好,.h文件如下:

重新编译运行生成dll。

再次查看def文件。

类且不管,我们需要用到的HelloWorld与add函数都恢复了,在test1.cpp中测试一下。

ok的,可以正常使用。

要查看dll中的函数方法,可以使用dumpbin.exe,这个是什么,需要自行摸索,这里仅提及一下。

以及使用步骤:

打开dumpbin.exe文件夹,进入cmd命令行。dumpbin /exports C:\hello.dll。即可查看。

显然,后面是一个绝对路径,因为没有必要把一个dll复制到其文件夹下进行查看。

具体如何使用,就需要参考其他文章了。

相关推荐

寻仙5000万战力详解(上)
365bet投注网

寻仙5000万战力详解(上)

📅 07-09 👁️ 3997
碧蓝航线凤翔在哪打捞 碧蓝航线凤翔打捞地点
365bet投注网

碧蓝航线凤翔在哪打捞 碧蓝航线凤翔打捞地点

📅 07-11 👁️ 2669
关于女性私处,这 20 个问题你不能不知道
365bet投注网

关于女性私处,这 20 个问题你不能不知道

📅 06-28 👁️ 299
如何制作雷达图
365bet投注网

如何制作雷达图

📅 06-27 👁️ 2784
《希望OL》战宠的帮助 战宠获取任务攻略
365体育旗下APP

《希望OL》战宠的帮助 战宠获取任务攻略

📅 06-28 👁️ 891
看销售人员如何“五步”打开新的区域市场
外围365bet网址

看销售人员如何“五步”打开新的区域市场

📅 08-13 👁️ 9430
大乐透近10期周三奖号分布:前区连号热开9期
外围365bet网址

大乐透近10期周三奖号分布:前区连号热开9期

📅 08-13 👁️ 7450
王者荣耀关羽多少钱 王者荣耀关羽金币价格详解
外围365bet网址

王者荣耀关羽多少钱 王者荣耀关羽金币价格详解

📅 07-01 👁️ 995
巴西著名球迷“金杯老翁”去世 1
365bet投注网

巴西著名球迷“金杯老翁”去世 1

📅 06-28 👁️ 4666