精华内容
下载资源
问答
  • 我先是建立了一个 MFC项目,然后又建立了一个Win32 DLL 到处符号 项目,然后在Helper.h和Helper.cpp声明和定义了两个函数分别是 StartHook() 和 StopHook(),然后在MFCApp属性设置了附加依赖项 Helper.lib...
  • Depends用来显示与一个可执行文件(exe或者dll)相关的依赖项(动态链接库dll),以及该exe或dll引用了这些dll中的哪些接口,同时也可以看到每个被依赖的dll中的所有导出的函数接口。 在VC6位于如下目录; 加载...

    VC++中Depends工具;Depends用来显示与一个可执行文件(exe或者dll)相关的依赖项(动态链接库dll),以及该exe或dll引用了这些dll中的哪些接口,同时也可以看到每个被依赖的dll中的所有导出的函数接口。

    在VC6位于如下目录;

    加载一个系统dll查看一下;出现下图错误提示;大致说...加载失败...循环依赖...;因为此dll又调用了其它dll;

    左上角是Dll信息窗口,显示引用到的Dll模块,
    右边第一个窗口是所选的Dll模块所使用的函数,
    右边第二个窗口是所选Dll模块的所有的导出函数,
    下面窗口是所有需要的Dll模块的属性,
    右边两个窗口出现四个标签:序号,提示,函数,入口点;
    如果导出是函数,那么出现函数名,如果导出的是序号,那么函数项就是N/A(无法显示)出现红色提示表示不正常,一般为没有该导出函数;

    看一下系统自带的ICMP.dll;就是实现ping功能的那个;

    在C++中有一种dll函数调用方式;就是通过LoadLibrary、 GetProcAddress,载入模块之后,获取函数地址,通过函数地址来调用函数;在安全类编程中会用到;

    下面来看一下示例;获取user32中的MessageBox函数地址;

       新建一个VC++ MFC工程;

    CPP文件包含此句:#include <windows.h>
    CPP文件头部添加:typedef void (*MYPROC)(LPTSTR);
    在某个消息处理函数中,单击菜单或按钮,或对话框初始化消息;添加如下代码;显示载入DLL以后的DLL模块地址和MessageBoxA函数地址;
       

        HINSTANCE LibHandle;
        MYPROC ProcAdd;
        LibHandle = LoadLibrary("user32");
        
        CString temp_value1 = _T("");
        temp_value1.Format(_T("user32 LibHandle = 0X%x\n"), LibHandle);
        AfxMessageBox(temp_value1);
    
        ProcAdd=(MYPROC)GetProcAddress(LibHandle,"MessageBoxA");    
        CString temp_value2 = _T("");
        temp_value2.Format(_T("MessageBoxA = 0X%x\n"), ProcAdd);
        AfxMessageBox(temp_value2);

    运行结果如下;环境是Win10,VC6;

    也就是说载入uder32 DLL的基址在0x74ab0000;MessageBoxA函数地址在基址之后一些;

    展开全文
  • 昨天遇到一问题,令我百思不得其解,问题大概是这样的:函数封装都是写在外部dll中的,主程序部分只是一些简单的调用。dll中有一个方法原型大概是这样的:bool Function(list& l)在主程序中调用一切没有问题,得出的...

    昨天遇到一问题,令我百思不得其解,问题大概是这样的:

    函数封装都是写在外部dll中的,主程序部分只是一些简单的调用。
    dll中有一个方法原型大概是这样的:bool Function(list<Type>& l)

    在主程序中调用一切没有问题,得出的结果也是正确的,只是在主程序结束析构数据成员时出错。
    查看Call Stack,确定是析构时出错,_CrtIsValidHeapPointer断言验证失败

     

    起初把注意力都放在析构上了,走了死胡同,以为是模板类型Type引起的问题,导致内存读写错误。把list换成vector,把stack内存声明换为heap,都是同样的问题,写了个简单的Console App,怎么玩都不会出错。

     

    把问题再次聚焦到断言_CrtIsValidHeapPointer,MSDN如下解释:

    Verifies that a specified pointer is in the local heap (debug version only).

    这里的关键是in the LOCAL heap,外部dll不在此列,当然就出错了 -_-~!!!

     

    把Debug模式换为Release,一切OK。 

     

    哎 !  白忙活一场

    展开全文
  • c/c++_stdcall与dll动态调用

    千次阅读 2018-01-25 13:29:40
    1._stdcall在动态dll调用中的注意事项 为了用vc写的dll能被其它语言的写的程序使用,即实现跨语言。我们在dll的函数调用约定中使用__stdcall . 但当用GetProcAddress调用是却失败了. 用dumpbin工具...

    1._stdcall在动态dll调用中的注意事项

    为了用vc写的dll能被其它语言的写的程序使用,即实现跨语言。我们在dll的函数调用约定中使用__stdcall .

    但当用GetProcAddress调用是却失败了.

    用dumpbin工具查看导出的函数名可以看到:导出的函数名确实为_mygetGrad@20

    所以我们要阻止导出的函数名被编译器修改,方法就是使用def文件

    ; xxx.def : Declares the module parameters for the DLL.
    LIBRARY      "xxx"
    EXPORTS
        ; Explicit exports can go here
        mygetGrad @1

    这样重新调用GetProcAddress就正确了

    并且在函数指针定义和GetProcAddress时必须把__stdcall 加上否则运行时会报错

    void (_stdcall *mygetGrad)(unsigned char*, unsigned char*, int, int, long);


    2. .c文件中函数中间声明变量有时会报错,把声明放到最前面就ok,不知道为啥


    3.动态加载要#include <windows.h>


    4.LoadLibraryA与LoadLibrary

    LoadLibrary动态加载dll失败,把LoadLibrary改为LoadLibraryA就ok

      HMODULE hDllInst;
      void (_stdcall *mygetGrad)(unsigned char*, unsigned char*, int, int, long);
      hDllInst = NULL;
      mygetGrad = NULL;
      hDllInst = LoadLibraryA("FignerPrintAnalysis.dll");

      mygetGrad = (void (_stdcall *)(unsigned char*, unsigned char*, int, int, long))GetProcAddress(hDllInst,"mygetGrad");


    参考

    http://blog.csdn.net/cglover/article/details/1621685

    http://blog.csdn.net/guoyong10721073/article/details/52399027

    http://blog.csdn.net/dybinx/article/details/7709822

    展开全文
  • 函数的 声明 Public Declare Function Sms_Connection Lib "sms.dll" (ByVal CopyRight As String, ByVal ...为什么 同样一个函数Sms_Connection调用 ,第一个调用格式成功执行,第二个调用格式调用 失败
  • Delphi中制作DLL中回调函数的应用

    热门讨论 2007-01-20 15:28:11
    •Delphi程序之间调用DLL,如果要用String类型话,要在引用单元加上ShareMem 单元。 •如果Delphi写DLL供其他开发工具使用话,不要使用String类型,用PAnsiChar类型。 尽量使用标准DLL接口。指是传递...
  • 在MFC中,使用bitmap的LoadBitmap函数调用DLL中的资源时,会返回0   此时,在LoadBitmap方法之前,加上语句 AFX_MANAGE_STATE(AfxGetStaticModuleState()); 即可。   即: CBitmap bitmap; AFX_MANAGE_STATE...

    在MFC中,使用bitmap的LoadBitmap函数调用DLL中的资源时,会返回0

     

    此时,在LoadBitmap方法之前,加上语句  AFX_MANAGE_STATE(AfxGetStaticModuleState()); 即可。

     

    即:

    CBitmap bitmap;
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    bitmap.LoadBitmap(IDB_RED); 


     

    展开全文
  • 如题,我确定MYSQL API函数的调用方法没错,因为在一般exe应用程序中调用时是成功,但是在DLL中引用以后DLL便会加载失败,是DLL在引用MYSQL API时和一般应用程序不一样么?新手没有金币,请大神不吝赐教。
  • Lua 调用C模块DLL失败

    2017-03-02 16:55:00
    Lua中使用 local a = require "xxx" 方式加载自己用C实现DLL,DLL中有导出函数luaopen_xxx 。 调试过程中发现,luaopen_xxx 传入 L 是有值,但是使用lua_gettop 拿到是 -1,其他操作都会出现崩溃。 ...
  • 问题说明:TranBaowenInfo.dll 是自己编写动态链接库,库导出函数名为GetTranslateInfo(),调试时一直提示加载库成功(ok dll),但是加载库导出函数一直失败(shibai func)。 typedef bool (*...
  • 比如你想限制你某个函数只能被自己某个特定的DLL调用。 或者比如在异常处理你想了解是那个 DLL/EXE抛出了异常。 收藏失败,转过来。 原址:http://blog.csdn.net/wingeek/article/details/3872526 API函数...
  • DoModal()函数调用失败的原因分析:

    千次阅读 2014-08-07 11:03:04
    DoModal()函数调用失败的... 第一种表现主要是因为没有对资源句柄进行切换造成,以在DLL中弹出对话框中最为常见。解决办法是:如果是MFC规则DLL,可以使用所有导出函数的开始处添加 AFX_MANAGE_STATE宏,具体代码为
  • QT调用DLL失败原因总结

    千次阅读 2019-08-22 21:28:13
    前段时间我想用QT调用外部dll里面的函数,并且没有.h头文件和.lib静态库。 发现有时候调用不成功,举例说明我的代码如下: typedef int (*Fun)(); QLibrary testLib("Protocol.dll"); //已把dll放在debug if ...
  • 结构体中的回调函数onConnected 这部分代码用Delphi如何写?麻烦高手给看一下 下面是C#的demo CCPCall.instance.loginInterface = this; string ret = CCPCall.instance.LoginCCP(); if (ret != null) {...
  • //定义一个函数指针,下面用来指向JVM中的JNI_CreateJavaVM函数 typedef jint (WINAPI *PFunCreateJavaVM)(JavaVM **, void **, void *); //const wchar_t szJvmPath[]=L"D:\\Java\\jdk1.8.0_131\\jre\\bin\\...
  • DLL调用OCX例子demo

    2016-09-21 15:13:17
    DLL调用OCX(activex)例子, 代码都是DEBUG编译, 内容包括OCX, DLL, EXE文件。 OCX制作方法就不说了, 说下关键点就是OCX必需要重载一下IsInvokeAllowed函数,,让它直接返回true,否则将不成功,被告之是灾难性...
  • myPythonClient(下图)想要调用一个ringBell函数(使用DLL从DLL中加载ctypes)。但是,尝试ringBell通过其名称访问将导致AttributeError。为什么? 学习python中有什么不懂地方,小编这里推荐加小编python学习...
  •  第一种表现主要是因为没有对资源句柄进行切换造成,以在DLL中弹出对话框中最为常见。解决办法是:如果是MFC规则DLL,可以使用所有导出函数的开始处添加 AFX_MANAGE_STATE宏,具体代码为:AFX_MANAGE_STATE(A
  •  第一种表现主要是因为没有对资源句柄进行切换造成,以在DLL中弹出对话框中最为常见。解决办法是:如果是MFC规则DLL,可以使用所有导出函数的开始处添加 AFX_MANAGE_STATE宏,具体代码为:AFX_MANAGE_STATE
  • 在一个MFC应用程序exe中,调用另一个DLL中的函数,函数中的一个形参是string类型的,每次调用都会出现乱码的情况,并且会崩溃。 调用前: 调用后: 2、原因分析: 不同的模块各自有一份C运行时库代码、...
  • 我们在dll的函数调用约定使用__stdcall .但当用GetProcAddress调用是却失败了.例如:extern "C" ITimeSource* __stdcall CreateTimeSource(ETimeSourceType type)typedef ITimeSource *( __stdcall
  • 最近在编写C#上位机应用程序,需要调用C++的dll,期间遇到dll接口库char*类型纠结了很久,试过string,StringBuilder,StringBuilder结果都以失败告终,通过查找博客等资料最后找到了救命稻草---IntPtr。...
  • 在导出函数中加上AFX_MANAGE_STATE(AfxGetStaticModuleState()); 
  • 3、程序通过调用DLL中的H264_DVR_StartActiveRigister(port, ActiveRegCallBack, 0))方法开始监听端口,ActiveRegCallBack为设备上线后的回调函数,能够得到上线设备的信息。 遇到的问题: 现在程序能够正常的运行...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 210
精华内容 84
关键字:

dll中调用dll中的函数失败