`
congfeng02
  • 浏览: 199998 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

自己实现的第一个linux中dll的调用

阅读更多

自己实现的第一个linux中dll的调用


1. 编译dll:

g++ -shared -lc -o strcase.dll lowcase.cpp uppercase.cpp

如果要加入调试信息:(加上 -g选项)

g++ -shared -lc -o strcase.dll lowcase.cpp uppercase.cpp -g


编译c++ dll注意函数之前需要加上 extern "C",否则在dlsym函数调用的时候可能会找不到函数


.


2. 编译exe:

g++ -ldl -o strcase.exe main.cpp

如果要加入调试信息:(加上 -g选项)

g++ -ldl -o strcase.exe main.cpp -g


3. gdb调试

gdb strcase.exe

调试时需要在编译的时候加上(-g)选项


gdb命令:


b 设置断点,例如:

b main #表示跳到main函数

b main.cpp: 56 #56表示行号


l 打印当前的执行代码附近的10行


p 打印变量szMsg的值

p szMsg


n 执行下一行(单步执行, 类似VC中的F10)


s 进入函数(类似VC中的F10)


r 执行(类似VC中的F5)


//main.cpp

Cpp代码<embed type="application/x-shockwave-flash" width="14" height="15" src="http://andylin02.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Cspan%20style%3D%22font-size%3A%20medium%3B%22%3E%3Cspan%20style%3D%22color%3A%20%233366ff%3B%22%3E%23include%20%3Ciostream%3E%0A%23include%20%3Cstdlib.h%3E%0A%23include%20%3Cdlfcn.h%3E%0Ausing%20namespace%20std%3B%0A%0A%23define%09TRUE%091%0A%23define%20FALSE%090%0Atypedef%20int%20%09BOOL%3B%0Atypedef%20void%20(*PFUN_STRING)(char*%20pszStr)%3B%0A%0ABOOL%20UseDll(char*%20szMsg)%3B%0A%0Aint%20main()%0A%7B%0A%09char%20szMsg%5B%5D%20%3D%20%22Hello%2C%20andylin!%22%3B%0A%09%0A%09%2F%2F%E8%B0%83%E7%94%A8dll%0A%09UseDll(szMsg)%3B%0A%09%0A%09return%200%3B%0A%7D%0A%0ABOOL%20UseDll(char*%20szMsg)%0A%7B%0A%09void*%20hDll%20%3D%20NULL%3B%0A%09char*%20szDllErr%20%3D%20NULL%3B%0A%09PFUN_STRING%20pfunUpper%20%3D%20NULL%3B%0A%09PFUN_STRING%20pfunLower%20%3D%20NULL%3B%0A%09%0A%09if%20(NULL%20%3D%3D%20szMsg)%0A%09%7B%0A%09%09return%20FALSE%3B%0A%09%7D%0A%09%0A%09cout%20%3C%3C%20%22The%20Origin%20String%3A%22%20%3C%3C%20szMsg%20%3C%3C%20endl%3B%0A%09%0A%09%2F%2Fopen%20dll%0A%09hDll%20%3D%20dlopen(%22.%2Fstrcase.dll%22%2C%20RTLD_LAZY)%3B%0A%09szDllErr%20%3D%20dlerror()%3B%09%0A%09if%20(szDllErr)%0A%09%7B%0A%09%09cout%20%3C%3C%20%22open%20uppercase.dll%20error!%20err%20info%3A%22%20%3C%3C%20szDllErr%20%3C%3C%20endl%3B%0A%09%09return%20FALSE%3B%0A%09%7D%0A%09%0A%09%2F%2Ffind%20the%20function%0A%09pfunUpper%20%3D%20(PFUN_STRING)dlsym(hDll%2C%20%22StrUpper%22)%3B%09%0A%09szDllErr%20%3D%20dlerror()%3B%0A%09%0A%09if%20(szDllErr)%0A%09%7B%0A%09%09cout%20%3C%3C%20%22find%20function%20StrUpper%20Error!%20err%20info%3A%22%20%3C%3C%20szDllErr%20%3C%3C%20endl%3B%0A%09%09return%20FALSE%3B%0A%09%7D%0A%09%0A%09(*pfunUpper)(szMsg)%3B%0A%09cout%20%3C%3C%20%22after%20StrUpper%20string%3A%22%20%3C%3C%20szMsg%20%3C%3C%20endl%3B%0A%09%0A%09%2F%2Fcall%20StrLower%0A%09pfunLower%20%3D%20(PFUN_STRING)dlsym(hDll%2C%20%22StrLower%22)%3B%0A%09szDllErr%20%3D%20dlerror()%3B%0A%09%0A%09if%20(szDllErr)%0A%09%7B%0A%09%09cout%20%3C%3C%20%22find%20function%20StrLower%20Error!%20err%20info%3A%22%20%3C%3C%20szDllErr%20%3C%3C%20endl%3B%0A%09%09return%20FALSE%3B%0A%09%7D%0A%09%0A%09(*pfunUpper)(szMsg)%3B%0A%09cout%20%3C%3C%20%22after%20StrLower%20string%3A%22%20%3C%3C%20szMsg%20%3C%3C%20endl%3B%0A%09%0A%09%2F%2Fclose%20handle%0A%09int%20nRet%20%3D%20dlclose(hDll)%3B%0A%09szDllErr%20%3D%20dlerror()%3B%0A%09cout%20%3C%3C%20%22close%20dll%20info%3A%22%20%3C%3C%20szDllErr%20%3C%3C%20endl%3B%09%0A%7D%0A%3C%2Fspan%3E%3C%2Fspan%3E"></embed>
  1. <spanstyle="font-size:medium;"><spanstyle="color:#3366ff;">#include<iostream>
  2. #include<stdlib.h>
  3. #include<dlfcn.h>
  4. usingnamespacestd;
  5. #defineTRUE1
  6. #defineFALSE0
  7. typedefintBOOL;
  8. typedefvoid(*PFUN_STRING)(char*pszStr);
  9. BOOLUseDll(char*szMsg);
  10. intmain()
  11. {
  12. charszMsg[]="Hello,andylin!";
  13. //调用dll
  14. UseDll(szMsg);
  15. return0;
  16. }
  17. BOOLUseDll(char*szMsg)
  18. {
  19. void*hDll=NULL;
  20. char*szDllErr=NULL;
  21. PFUN_STRINGpfunUpper=NULL;
  22. PFUN_STRINGpfunLower=NULL;
  23. if(NULL==szMsg)
  24. {
  25. returnFALSE;
  26. }
  27. cout<<"TheOriginString:"<<szMsg<<endl;
  28. //opendll
  29. hDll=dlopen("./strcase.dll",RTLD_LAZY);
  30. szDllErr=dlerror();
  31. if(szDllErr)
  32. {
  33. cout<<"openuppercase.dllerror!errinfo:"<<szDllErr<<endl;
  34. returnFALSE;
  35. }
  36. //findthefunction
  37. pfunUpper=(PFUN_STRING)dlsym(hDll,"StrUpper");
  38. szDllErr=dlerror();
  39. if(szDllErr)
  40. {
  41. cout<<"findfunctionStrUpperError!errinfo:"<<szDllErr<<endl;
  42. returnFALSE;
  43. }
  44. (*pfunUpper)(szMsg);
  45. cout<<"afterStrUpperstring:"<<szMsg<<endl;
  46. //callStrLower
  47. pfunLower=(PFUN_STRING)dlsym(hDll,"StrLower");
  48. szDllErr=dlerror();
  49. if(szDllErr)
  50. {
  51. cout<<"findfunctionStrLowerError!errinfo:"<<szDllErr<<endl;
  52. returnFALSE;
  53. }
  54. (*pfunUpper)(szMsg);
  55. cout<<"afterStrLowerstring:"<<szMsg<<endl;
  56. //closehandle
  57. intnRet=dlclose(hDll);
  58. szDllErr=dlerror();
  59. cout<<"closedllinfo:"<<szDllErr<<endl;
  60. }
  61. </span></span>

//lowcase.cpp

Cpp代码<embed type="application/x-shockwave-flash" width="14" height="15" src="http://andylin02.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Cspan%20style%3D%22font-size%3A%20medium%3B%22%3E%3Cspan%20style%3D%22color%3A%20%233366ff%3B%22%3E%23include%20%3Cstdio.h%3E%0A%23include%20%3Cstdlib.h%3E%0A%23include%20%3Ciostream%3E%0Ausing%20namespace%20std%3B%0A%0Aextern%20%22C%22%20void%20StrLower(char*%20pszStr)%0A%7B%0A%09if%20(NULL%20%3D%3D%20pszStr)%0A%09%7B%0A%09%09return%3B%0A%09%7D%0A%0A%09int%20nLen%20%3D%200%3B%0A%09int%09i%20%3D%200%3B%0A%09%0A%09nLen%20%3D%20strlen(pszStr)%3B%0A%09for%20(i%20%3D%200%3B%20i%20%3C%20nLen%3B%20i%2B%2B)%0A%09%7B%0A%09%09if%20(%20(pszStr%5Bi%5D%20%3E%3D%20'A')%20%26%26%20(pszStr%5Bi%5D%20%3C%3D%20'Z')%20)%0A%09%09%7B%0A%09%09%09pszStr%5Bi%5D%20%2B%3D%2026%3B%0A%09%09%7D%0A%09%7D%0A%7D%0A%3C%2Fspan%3E%3C%2Fspan%3E"></embed>
  1. <spanstyle="font-size:medium;"><spanstyle="color:#3366ff;">#include<stdio.h>
  2. #include<stdlib.h>
  3. #include<iostream>
  4. usingnamespacestd;
  5. extern"C"voidStrLower(char*pszStr)
  6. {
  7. if(NULL==pszStr)
  8. {
  9. return;
  10. }
  11. intnLen=0;
  12. inti=0;
  13. nLen=strlen(pszStr);
  14. for(i=0;i<nLen;i++)
  15. {
  16. if((pszStr[i]>='A')&&(pszStr[i]<='Z'))
  17. {
  18. pszStr[i]+=26;
  19. }
  20. }
  21. }
  22. </span></span>

//uppercase.cpp

Cpp代码<embed type="application/x-shockwave-flash" width="14" height="15" src="http://andylin02.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Cspan%20style%3D%22font-size%3A%20medium%3B%22%3E%3Cspan%20style%3D%22color%3A%20%233366ff%3B%22%3E%23include%20%3Cstdio.h%3E%0A%23include%20%3Cstdlib.h%3E%0A%23include%20%3Ciostream%3E%0Ausing%20namespace%20std%3B%0A%0Aextern%20%22C%22%20void%20StrUpper(char*%20pszStr)%0A%7B%0A%09if%20(NULL%20%3D%3D%20pszStr)%0A%09%7B%0A%09%09return%3B%0A%09%7D%0A%0A%09int%20nLen%20%3D%200%3B%0A%09int%09i%20%3D%200%3B%0A%09%0A%09nLen%20%3D%20strlen(pszStr)%3B%0A%09for%20(i%20%3D%200%3B%20i%20%3C%20nLen%3B%20i%2B%2B)%0A%09%7B%0A%09%09if%20(%20(pszStr%5Bi%5D%20%3E%3D%20'a')%20%26%26%20(pszStr%5Bi%5D%20%3C%3D%20'z')%20)%0A%09%09%7B%0A%09%09%09pszStr%5Bi%5D%20-%3D%2026%3B%0A%09%09%7D%0A%09%7D%0A%7D%3C%2Fspan%3E%0A%3C%2Fspan%3E"></embed>
  1. <spanstyle="font-size:medium;"><spanstyle="color:#3366ff;">#include<stdio.h>
  2. #include<stdlib.h>
  3. #include<iostream>
  4. usingnamespacestd;
  5. extern"C"voidStrUpper(char*pszStr)
  6. {
  7. if(NULL==pszStr)
  8. {
  9. return;
  10. }
  11. intnLen=0;
  12. inti=0;
  13. nLen=strlen(pszStr);
  14. for(i=0;i<nLen;i++)
  15. {
  16. if((pszStr[i]>='a')&&(pszStr[i]<='z'))
  17. {
  18. pszStr[i]-=26;
  19. }
  20. }
  21. }</span>
  22. </span>

分享到:
评论

相关推荐

    亲测可用,java 成功调用dll函数。包含调用回调函数,springboot版本。最近由于公司业务需要,要调用dll文件,用JNA调用。

    5. **处理回调**:在定义的回调函数接口中实现具体的逻辑,确保与DLL的约定一致。 6. **测试和优化**:编写测试用例验证功能是否正确工作,并根据性能需求进行优化。 了解这些概念和步骤后,开发者便能利用Java和...

    QT5中调用DLL

    QT5是Qt框架的第五个主要版本,它是一个流行的开源跨平台应用程序开发框架,支持Windows、Linux、macOS等多个操作系统。在QT5中调用DLL(动态链接库)是一项常见的需求,尤其当需要复用已有的C++代码或实现特定功能...

    Java调用DLL例子

    Java本身并不直接支持DLL调用,但通过一些第三方库,我们可以实现这样的功能。本示例以"Java调用DLL例子"为主题,使用了JNative库作为接口来实现Java调用本地动态链接库。 JNative是一个开源的Java库,它提供了一种...

    [测试通过]JAVA调用第三方DLL的简单方法:JNA及DEMO

    在Java中,由于其跨平台的特性,原生与操作系统交互并不直接,而JNA提供了一种桥接机制,使得Java可以直接调用Windows、Linux等操作系统中的DLL文件,实现对操作系统功能的访问。 【JNA简介】 JNA提供了一种高级...

    Java调用动态链接库(Java 调用 DLL)

    Java调用动态链接库(DLL)是Java编程中一个比较特殊的技术,主要涉及到Java与本地代码的交互。在Windows系统中,DLL(Dynamic Link Library)是实现函数复用的一种方式,它包含了一系列可供其他程序调用的函数或数据...

    yolov3 dll c# 调用

    5. **创建C#接口**:在C#项目中,创建一个类来封装DLL的调用,定义DllImport属性以指定DLL中的函数。这些函数可能包括初始化模型、进行推理和释放资源等。 6. **调用DLL**:在C#代码中,实例化上述类,然后调用其...

    C编写dll及调用C编写dll及调用

    这些函数的声明通常放在一个头文件中,以便在使用DLL的项目中包含。例如: ```c #ifndef MY_DLL_API_H #define MY_DLL_API_H #ifdef _WIN32 #ifdef MY_DLL_EXPORTS #define MY_DLL_API __declspec(dllexport...

    java调用dll接口

    Java本身并不直接支持DLL调用,但可以通过一些第三方库来实现这一目标,例如Java Native Access(JNA)。 JNA是Java平台的一个开源库,它提供了直接访问操作系统原生API的能力,无需编写C代码或使用JNI(Java ...

    JNI调用第三方dll实例

    然后,你需要实现`callDllFunction`方法,使用`LoadLibrary`和`GetProcAddress`函数加载并调用第三方DLL中的函数。 4. **VS2010配置**:在Visual Studio 2010中,创建一个新的Win32 Console Application项目,并...

    [JAVA]使用JNI技术实现JAVA程序调用dll

    我把设备商提供的 dll 文件称之为第三方 dll 文件,因為 JNI 直接调用的是按它的标准使用 C/C++ 语言编译的 dll 文件,这个文件是客户程序员按照设备商提供的 .h 文件中的列出的方法编写的 dll 文件,我称之为第二方...

    Linux下使用Java调用Hikvision设备网络SDK的使用指南.pdf

    Linux下使用Java调用Hikvision设备网络SDK使用指南涉及的知识点相当丰富,本指南主要围绕如何在Linux平台下调用海康威视提供的设备网络SDK进行功能调用,重点是利用Java语言实现摄像机的抓拍功能。以下是本指南的...

    java调用dll或so库示例

    Java调用DLL或SO库是跨平台编程中的一个重要技术,主要通过Java本地接口(JNI)实现。JNI允许Java代码直接调用本地(如C++)编写的动态链接库(DLL,Windows系统)或共享对象库(SO,Linux系统),从而扩展Java应用...

    java调用C语言编写的so库中的函数,java调用C语言编写的dll库中的函数

    1. **定义接口**:在Java中创建一个接口,其方法签名对应于本地库的函数。 2. **加载库**:使用`Native.loadLibrary("库名",接口类型)`加载动态链接库,并指定接口。 3. **调用函数**:直接通过接口实例调用本地...

    LABVIEW中调用DLL的高级技

    在LabVIEW编程环境中,调用DLL(动态链接库)是一项重要的技术,特别是在处理与硬件交互、利用第三方库或实现特定算法时。DLL是Windows操作系统中的一种共享库,它包含了一组可重用的函数和资源,可以被多个应用程序...

    JAVA调用第三方DLL的方法

    在Java编程中,有时我们需要调用第三方的DLL(动态链接库)来实现特定的功能,这在集成外部系统或使用特定硬件设备时尤为常见。本文将详细介绍如何在Java中调用第三方DLL,以及在不同操作系统上的部署策略。 首先,...

    dotnetbar7.0 第三方控件.net控件 dll

    【标题】"dotnetbar7.0 第三方控件.net控件 dll" 是一个关于.NET框架下第三方开发的用户界面控件库,主要用于Windows应用程序的开发。DotNetBar是一款功能丰富的控件集,它包含了多种控件,如工具栏、菜单、状态栏、...

    Java类中调用dll的步骤及jar包

    1. **创建Java接口**:定义一个Java接口,这个接口中的方法将映射到dll中的函数。例如: ```java public interface NativeDll { int doSomething(int input); } ``` 2. **编译JNI头文件**:使用`javah`工具...

    delphi编写so库,及调用实例,linux下运行,Deepin系统

    Delphi是一种强大的对象 Pascal 编程语言,通常用于Windows环境,但通过使用第三方工具和特定技术,它也可以在Linux系统上创建应用。本篇将深入探讨如何使用Delphi编写共享库(SO库)并在Linux的Deepin操作系统上...

    UE4 4.15 加载第三方dll so

    本教程将详细讲解如何在UE4 4.15版本中加载第三方的DLL(动态链接库)文件以及SO(在Android系统上的共享库)文件,以便调用其中的特定函数,例如`arwIsRunning`,在Windows和Android平台上实现跨平台功能。...

    关于和升达加密狗linux下java调用,(非官方)

    在给定的标题“关于和升达加密狗linux下java调用,(非官方)”中,我们可以推断出这是一个关于如何在Linux操作系统环境下,使用Java语言与非官方支持的和升达加密狗进行交互的主题。这种交互可能涉及到特定的API...

Global site tag (gtag.js) - Google Analytics