zoukankan      html  css  js  c++  java
  • 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 <windows.h>
    
    DllClass::DllClass()
    {
    
    }
    
    DllClass::~DllClass()
    {
    
    }
    
    void DllClass::HelloWorld()
    {
    	MessageBox(0, "Hello World from DLL!
    ","Hi",MB_ICONINFORMATION);
    }
    DLLIMPORT void HelloWorld()
    {
    	MessageBox(0, "Hello World from DLL!
    ","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复制到其文件夹下进行查看。

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

  • 相关阅读:
    在source insight中阅读Python代码
    修改linux命令行提示符
    gcc链接程序时出现undefined reference to""错误
    [转]init.d解析
    [转]Linux中find常见用法示例
    Linux的网卡由eth0变成了eth1,如何修复?
    测试使用Windows Live Writer
    黑盒测试
    白盒测试技术(二)
    白盒测试技术(一)
  • 原文地址:https://www.cnblogs.com/dayq/p/14343143.html
Copyright © 2011-2022 走看看