精华内容
下载资源
问答
  • dll调用CoInitialize 问题

    2016-11-04 09:01:15
    写了个dll调用CoInitialize 时出现了无法解析的外部命令 然后网上查了一下,有说不该在dll中调用这个函数,也有说应该调用的,如果应该调用的话,那个无法解析的外部命令是什么原因呢?
  • PowerShell-4.API调用以及DLL调用

    千次阅读 2016-12-14 20:01:58
    PowerShell-4.API调用以及DLL调用

    PowerShell可以直接调用API,So...这东西完全和cmd不是一回事了...

    调用API的时候几乎和C#一样(注意堆栈平衡):

    调用MessageBox:

     

    $iii = Add-Type -memberDefinition @"
    [DllImport("User32")]
    public static extern int MessageBox (
    long hWnd,
    string lpText,
    string lpCaption,
    int uType);
    "@ -passthru -name XXX
     
    $iii::MessageBox(0 ,'test' ,'tit' ,0)


    PowerShell 调用我们自己的dll

    (下面是网上粘贴的别人的,我本意是要调用C++dll,但是按照C#的姿势调用失败了,现在采取的方案是通过rundll32来桥接PowerShell调用C++dll)

     

    C#写一段代码编译为DLL文件

    namespace Math{
      public class Methods {
        public Methods() {
        }
        public static int CompareI(int a, int b) {
          if (a>b)
    return a;
          else
    return b;
        }
     
        public int CompareII(int a, int b) {
          if (a>b)
    return a;
          else
    return b;
        }
      }
    }
    
    [void][reflection.assembly]::LoadFile("G:/Math2.dll")  
    [Math.methods]::CompareI(10,2)  
    $a=New-Object Math.Methods  
    $a.CompareII(2,3)  
     
    [void][reflection.assembly]::LoadFile("D:/VS2008/VC/Math2.dll")
    我们必须以这种形式加载DLL库
    [Math.methods]::CompareI(10,2)
    我们看到Powershell在调用静态方法的时候必须使用方括号加上双冒号“::”的形式来调用静态方法。
    $a=New-Object Math.Methods
    $a.CompareII(2,3)
    而一般方法则不然,必须用New-Object来声明一个对象引用。


    展开全文
  • JNI中dll调用dll

    千次阅读 2009-05-15 21:52:00
    在上一篇文章中我谈了jni的基础知识,现在有人向我...我可以先用vc++写一个dll,然后使用JNI的方法来调用这个dll,就实现了dll调用dll的目的了。我把我的实现过程写下来: (1).在vc++中新建一个Win32 Dynamic-Link

     在上一篇文章中我谈了jni的基础知识,现在有人向我提出如何在dll中调用dll这个问题。刚开始我也一筹莫展,不知道如何去解决这个问题,找了一些资料,还是那篇文章“VC DLL简单教程”给了我启发。我可以先用vc++写一个dll,然后使用JNI的方法来调用这个dll,就实现了dll调用dll的目的了。我把我的实现过程写下来:

     

    (1).在vc++中新建一个Win32 Dynamic-Link Library工程,名称为A,写一个c++源文件:code.cpp,其内容    为:
         #include"iostream.h"

          extern "C" 
           int _declspec(dllexport) add(int a ,int b)
          {
              return a+b;
           }

     

         然后编译-->Build,在A工程的debug文件夹里得到一个A.dll文件

    (2).按照JNI 的方法,在java工程里面声明一个getNumber(int a,int b)的本地方法:

    public class Pick {

     /**
      * @param args
      */
     public native int getNumber(int a,int b);
     public static void main(String[] args) {
       }
    }

     

    然后在vc++中调用刚才的A.dll中的方法来实现该方法的功能,再建一个DLL工程B,添加三个头文件后,新建一个c++源文件mode.cpp 代码为:

    #include<iostream.h>
    #include<Windows.h>
    #include"pp_Pick.h"

    /*
     * Class:     pp_Pick
     * Method:    getNumber
     * Signature: (II)I
     */
    JNIEXPORT jint JNICALL Java_pp_Pick_getNumber
      (JNIEnv * env, jobject o, jint x, jint y)
    {
        typedef int (*ADD)(int ,int);//函数指针类型
     HINSTANCE Hint = ::LoadLibrary("A.dll");//加载我们刚才生成的dll
     ADD add = (ADD)GetProcAddress(Hint,"add");//取得dll导出的add方法
     return add(x,y);

     FreeLibrary(Hint);
    }

    编译,生成B.dll

     

    (3).然后把A.dll和B.dll都放进java工程根目录下,调用B.dll,运用getNumber(int a,int b)方法。

    public class Pick {

     /**
      * @param args
      */
     public native int getNumber(int a,int b);
     public static void main(String[] args) {
      // TODO Auto-generated method stub
              System.loadLibrary("B1");
              Pick p=new Pick();
              System.out.println(p.getNumber(1, 100));
     }
    }

    运行,输出结果为:101

     

    至此,dll调用dll的功能已经实现============。

    展开全文
  • 如何查看exe或dll调用了什么dll

    万次阅读 2017-03-03 22:53:01
    [转载]如何查看exe或dll调用了什么dll呢 已有 19410 次阅读 2014-4-17 21:08|系统分类:科研笔记|文章来源:转载 Dependency Walker使用说明 在Windows世界中,有无数块活动的大陆,它们都有一个共同的...

    [转载]如何查看exe或dll调用了什么dll呢

    已有 19410 次阅读 2014-4-17 21:08|系统分类:科研笔记|文章来源:转载

    Dependency Walker使用说明


    在Windows世界中,有无数块活动的大陆,它们都有一个共同的名字——动态链接库。现在就让我们走进这些神奇的活动大陆,找出它们隐藏已久的秘密吧!

      初窥门径:Windows的基石

      随便打开一个系统目录,一眼望去就能看到很多扩展名DLL的文件,这些就是经常说的“动态链接库”,DLL是Dynamic Link Library(即“动态链接库”)的缩写。从Microsoft公司推出首个版本的Windows以来,动态链接库就一直是这个操作系统的基础。

      1.看看DLL里有什么

      与其用晦涩的专业术语来解决DLL是什么,不如先来看看DLL里有什么。DLL和EXE文件一样,其中包含的也是程序的二进制执行代码和程序所需的资源(比如图标、对话框、字符串等),可是为什么要把代码放在DLL里面,而不是做成EXE呢?其实DLL中的代码是以API函数形式出现的,通俗地说,DLL中包含的程序代码都被做成了一个个小模块,应用程序通过按下所需DLL中特定的按钮,来调用DLL中这个按钮所代表的功能。在使用“记事本”等程序时,如果要保存文件或打开文件,就会弹出通用文件对话框,让我们选择文件位置。你可知道,这就是调用了系统底层DLL中的通用对话框界面。

      2.系统中几个重要的DLL

      Windows中有3个非常重要的底层DLL:Kernel32.dll、User32.dll、GDI32.dll。其中Kernel32.dll顾名思义就是内核相关的功能,主要包含用于管理内存、进程和线程的函数;而User32.dll中包含的则是用于执行用户界面任务的函数,比如把用户的鼠标点击操作传递给窗口,以便窗口根据用户的点击来执行预定的事件;GDI32.dll的名称用了缩写,全称是Graphical Device Interface(图形设备接口),包含用于画图和显示文本的函数,比如要显示一个程序窗口,就调用了其中的函数来画这个窗口。

      3.为什么要用DLL

      刚才在谈到这个问题的时候,我们只是解释了DLL将程序代码封装成函数的原理。为什么封装成函数,就能成为系统中大量使用DLL的理由呢?

      ①扩展应用程序

      由于DLL能被应用程序动态载入内存。所以,应用程序可以在需要时才将DLL载入到内存中,这让程序的可维护性变得很高。比如QQ的视频功能需要升级,那么负责编写QQ的程序员不必将QQ所有代码都重写,只需将视频功能相关的DLL文件重写即可。

      ②便于程序员合作

      这个和我们最终用户关系不大,仅供了解。我们都知道编程工具有很多,比如VB、VC、Delphi等,如果好几个人合作来编写一个大的程序,那么可能有的人用VB,有的人用VC,每人负责的部分所使用的编程语言都不同,究竟放在哪个编译器中进行编译呢?这就好比一群来自各个国家的人在共同编写一篇文章,如果他们所使用的语言都不同,写出来的文章怎么可能凑到一起呢?而有了DLL后,可以让VC程序员写一个DLL,然后VB程序员在程序中调用,无需为怎么将它们都编译为一个单独的EXE而发愁了。

      ③节省内存

      如果多个应用程序调用的是同一个动态链接库,那么这个DLL文件不会被重复多次装入内存中,而是由这些应用程序共享同一个已载入内存的DLL。就好比一个办公室中,很少会为每一个员工配置一台饮水机的,而是在一个公共位置放上一个饮水机,所有需要喝水的职员都可以共用这台饮水机,降低了成本又节约了空间。

      ④共享程序资源

      包括刚才提到过的通用文件对话框在内,DLL文件提供了应用程序间共享资源的可能。资源可以是程序对话框、字符串、图标,或者声音文件等。

      ⑤解决应用程序本地化问题

      在下载了某个程序的汉化包后,打开汉化说明,经常可以看到用下载包中的DLL文件覆盖掉程序原来的DLL,汉化就完成了。这些程序都是将执行代码和应用程序界面分开编写了,所以汉化者只需简单地将其中和程序界面相关的DLL汉化并发布即可。

    求知若渴:探究DLL的真相
      谁知道DLL里究竟有多少函数,又有谁知道EXE调用了哪个DLL的哪些函数?其实,这个问题并不难解决。还记不记得本刊2004年第6期的《无间盗IV——盗亦有盗》中介绍的分析EXE文件的工具Dependency Walker(以下简称Depends)今天我们要用它当探险工具,把DLL真相探个通通透透。
      1.看看DLL里有多少函数
      第一步:下载并解压Depends,运行其中的depends.exe,然后选择菜单“File→Open”(文件→打开),在文件选择框中选中需要分析的DLL文件并打开,此处选择QQ目录下的QQZip.dll。
      第二步:在程序左侧的树状栏中就列出了这个DLL使用了哪些其他DLL的功能函数(原来DLL中还可以调用其他DLL^O^),而右侧的两个分栏列表分别显示了函数输入及输出表,函数输出表即为该DLL提供给其他EXE或者DLL调用的函数的总列表。
      第三步:函数输出表的Function栏中即为输出函数的名称(见图1),在QQZip.dll中共发现了2个函数:Unzip、Zip。因此可以判断该DLL在QQ程序中负责压缩和解压缩的任务。

      2.审审EXE究竟用了哪个DLL
      还是拿QQ来作为例子,在Depends中打开QQ.exe,这时界面左侧的树状列表中显示的就是QQ.exe调用的DLL列表(见图2),如果展开这些DLL分支,还会发现其他的DLL,这就说明QQ调用的这些DLL文件还有可能(几乎是肯定)再调用别的DLL。这就好比买了一台新的DVD机,可能其中用的机芯是SONY的,而这个机芯里的一个小电容又有可能是别的公司的,这是同样的道理。


    3.用DLL看穿EXE真面目
      刚才得到了QQ.exe所使用的DLL列表,其实通过这个列表,还能分析出很多别的信息。比如其中包含MFC42.dll,所以可以判断QQ.exe是采用VC(即Visual C++)编写的,而包含WSOCK32.dll则说明这个程序带有网络通讯功能(废话!QQ如果不能网络通讯还有什么用……)。以下是一个简表,大家在分析别的EXE时可以根据其所使用的DLL来对其功能进行初步判断。
      DLL文件名 可以判断出的EXE信息
      MFC42.dll 使用VC5.0/6.0编写。
      VBRun*.dll “*”代表数字版本号,使用VB3.0/4.0编写。
      MSVBVM50.dll 使用VB5.0编写,在Windows 98(SE)上自带该DLL。
      MSVBVM60.dll 使用VB6.0编写,在Windows Me/2000/XP等系统上自带该DLL。
      ADVAPI32.dll 可能会进行注册表操作。
      WSOCK32.dll 具备网络通讯功能。
      WS2_32.dll 具备网络通讯功能。
      WININET.dll 具备HTTP浏览、下载等功能,典型的例子是浏览器、下载工具。
      WINMM.dll 具备多媒体播放能力。
      DDRAW.dll 游戏、高级图像处理工具。
      D3D*.dll 3D游戏,或者动画处理工具。
      4.DLL是个大宝库
      除供应用程序调用函数的DLL外,还有另一种用来保存资源的DLL,比如QQ目录下的QQRes.dll,用Depends打开后发现没有任何输出函数,难道是一个鸡肋DLL?可是改用资源工具Resource Hacker(下载地址:http://www.mydown.com/soft/42/42058.html)打开这个DLL后,就发现原来其中保存了这么多QQ的资源,包括图标、音乐、图片、字符串、对话框……(见图3)


    刨根问底:DLL的寓言
      DLL引起的故障是很常见的,为什么会引起故障?遇到故障怎么解决?嘘~偷听一下DLL的对话,你就会明白了。
      1.从搬运工谈接口兼容性
      在Windows工地上,有一个名叫EXE的包工头,他手下有很多称为DLL的建筑工人。其中有一个专门负责搬运的DLL(暂且称为“搬运工A”),每次需要搬运水泥时,包工头EXE都只要对他喊一声:“来!搬。”
      过了一段时间,搬运工A觉得自己的效率太低,于是从原来的每次搬1袋水泥改成了每次搬3袋水泥。改进了搬运方法后,EXE包工头仍然每次只是喊一声:“来!搬。”却不知搬运工A已经改变了搬运的方法。
      但又过了一段时间,包工头EXE把搬运工A给辞退了,从别的工地上找来了另一个DLL(暂且称为“搬运工B”)。这个搬运工在别的工地的时候,搬运东西特别快,所以包工头EXE决定把搬运工作给“升级”一下。但真正开始工作时,包工头才发现出了问题……现在不管叫几遍“来!搬。”这个新来的搬运工B都不知道究竟应该搬什么。
      上面的例子中,搬运工A改进搬运方法,但EXE调用它的方法仍不变,这就是DLL升级的原理,改进了内部的实现方法,但调用接口不变,这样EXE文件不用跟着升级,就能调用新版本的DLL了。而搬运工B的故事告诉我们,不管新版本的DLL效率多高,如果接口(可以理解为DLL中输出的函数名)与原来的不一致,那么EXE就不知道也无法调用它了。
      2.登记身份证的DLL
      在系统故障中,有很多都是由于DLL文件没有注册造成的,比如Windows XP的压缩文件夹功能出现故障就很有可能是系统目录中的zipfldr.dll没有注册造成的,这类故障的解决方法也大多是运行如下命令:
      regsvr32 DLL文件名
      很多人不理解为什么要这么做,是不是所有的DLL都能这样做呢?
      其实系统中有两种DLL,一种是不需注册即可使用的,另一种则是必须经过系统登录(即注册)才能使用的。就好像一个临时工,和一个记录在员工名单上的长期合同工的区别一样。如何才能区分这两种DLL呢?方法很简单,用刚才的Depends打开这个DLL,同样是看函数输出表,如果其中包含以下两个函数(前者是注册DLL,后者是反注册DLL),那么就一定是需要注册才能使用的DLL了。
      DllRegisterServer
      DllUnregisterServer
      而regsvr32这个命令,实际上就是调用DLL中的这两个函数(“regsvr32 /u DLL文件名”调用的即为DllUnregisterServer反注册函数)。
      3.插件DLL的秘密
      Winamp、Foobar 2000等很多软件都具有插件功能,从网上下载一个DLL放在插件目录下就能让程序支持新的功能,这是怎么做到的呢?就拿时下流行的播放软件“千千静听”来举例吧。
      “千千静听”的插件目录在该软件安装目录下的Addin子目录下,程序的插件目录一般都会以“Plugins”、“Addin”来命名。在“千千静听”的插件目录中有许多DLL文件,比如tt_asf.dll、tt_rm.dll等,从文件名中就能看出这些DLL是用来让这个播放器支持各种不同类型的音频文件的。同样,用Depends打开这些文件,你就会发现这些文件的输出函数表中都包括一个同样的函数:ttpGetSoundAddIn(见图4)。

      这就是插件的秘密,各种支持插件功能的程序在发布时,都会同时发布一份插件协议,协议中规定了该程序将要调用的插件DLL中必须包含的函数名称及相关的参数规则,然后第三方的插件程序员在编写这个程序的插件时就根据这个插件的标准来编写DLL的输出函数。
      ①对于插件tt_asf.dll
      ttplayer.exe(“千千静听”主程序)对tt_asf.dll说:“我要调用你的ttpGetSoundAddIn函数!”
      tt_asf.dll回答:“OK。”
      ②如果把不相关的DLL放进AddIn目录
      ttplayer.exe对未知DLL说:“我要调用你的ttpGetSoundAddIn函数!”
      tt_asf.dll回答:“那是什么函数?从来没听说过!”



    http://blog.sciencenet.cn/blog-720524-785947.html
    展开全文
  • VS2015 MFC DLL调用非模式对话框

    万次阅读 2018-12-20 14:21:18
    在我的VS2015 MFC DLL调用模式对话框这篇博客中,写了如何在mfc dll中调用模式对话框,那么如何调用非模式对话框了。如果我们直接把openDialog函数中调用模式对话框的代码改为调用非模式对话框的代码,如下图所示: ...

    在我的VS2015 MFC DLL调用模式对话框这篇博客中,写了如何在mfc dll中调用模式对话框,那么如何调用非模式对话框了。如果我们直接把openDialog函数中调用模式对话框的代码改为调用非模式对话框的代码,如下图所示:
    在这里插入图片描述
    代码如下:

    //编写mfc dll函数的实现
    int _stdcall openDialog()
    {
    	//AFX_MANAGE_STATE这句代码是用于模块切换时的状态保护,最好加上这一句
    	AFX_MANAGE_STATE(AfxGetStaticModuleState());
    	//定义调取非模式对话框
    	CDialog1 *pdlg=new CDialog1;
    	pdlg->Create(IDD_DIALOG1);
    	pdlg->ShowWindow(SW_SHOW);
    
    	return 0;
    }
    

    然后编译成功后,将mfc dll动态库导入到控制台程序中然后调用,代码如下:

    #include<iostream>
    //引入mfc dll动态库的头文件
    #include"mfcAPI.h"
    using namespace std;
    int main()
    {
    	//调用mfc dll中自己编写的openDialog()函数
    	openDialog();
    	system("pause");
    	return 0;
    }
    

    运行后会发现虽然飞模式对话框界面加载出来了,但是会一直卡在界面这,对话框上的按钮一个都没有加载出来
    在这里插入图片描述
    这种原因肯定是因为控制台程序是单一线程,如果想要在控制台程序中调用,要采用线程加消息循环的模式进行调用mfc dll的函数,但是mfc自身的框架就是消息模式,因此在试验的时候我直接用mfc应用程序来进行测试。也即是如果用其它语言进行调用mfc dll的非模式对话框,也必须采用消息循环模式,否则会阻塞,对话框界面无法打开。
    我在测试时直接在mfc里就行测试,使用vs2015新建一个mfc基于对话框应用程序,在主对话框界面上添加一个按钮,在按钮里引用mfc dll的openDialg函数,当然,对话框导入动态库也需要配置一下。
    在这里插入图片描述
    在按钮的点击事件中添加代码:
    在这里插入图片描述
    然后程序,点击按钮就可以调用mfc dll的openDialog函数。
    在这里插入图片描述

    展开全文
  • 新版谷歌、火狐都不支持NPAPI了,谷歌出了新的PPAPI方式,但限制本地DLL调用, 所有的硬件访问驱动都不能调用,有什么好的方法或方案还请不吝赐教!
  • C++通过DLL调用C#代码

    万次阅读 多人点赞 2013-03-18 10:48:06
    本文将介绍C++中通过DLL来调用C#...然后输入如下代码://C++通过DLL调用C#代码 //http://blog.csdn.net/morewindows/article/details/8678431 //By MoreWindows( http://blog.csdn.net/MoreWindows ) using System;
  • C++ 通过DLL调用C#代码

    千次阅读 2016-07-08 14:29:15
    本文将介绍C++中通过DLL来调用C#代码。 首先建立C#的“类库”工程CShapeDLL。 然后输入如下代码: ...//C++通过DLL调用C#代码  //http://blog.csdn.net/morewindows/article/details/8678431  //By Mor
  • DLL调用(1):C++静态调用DLL

    千次阅读 2017-12-12 18:07:49
    DLL(Dynamic Link Library)即动态链接库,DLL文件中存放封装的函数和类,当程序需要调用DLL所定义的功能时,需要先载入DLL文件,然后取得函数的地址,最后进行调用。 通过DLL调用功能,可实现代码的封装与复用...
  • DLL调用(2):C++动态调用DLL

    千次阅读 2017-12-12 18:42:07
    动态调用也被称为显示调用,即在运行程序过程中,需要调用DLL中的功能时才调用。相对于隐式调用,此种方式会有明确的语句载入DLL和获取其中的函数地址,调用过程相对静态调用会复杂一些,但不需要LIB文件的支持,仅...
  • DLL调用(3):Java JNA调用DLL

    千次阅读 2017-12-12 20:07:40
    Java调用C++的DLL方式很多,其中JNA方式是比较通用的一种。JNA(Java Native Access )提供一组Java工具类,可实现运行期动态访问系统本地库(native library)而不需要编写任何Native/JNI代码。程序需要在java接口...
  • 查看EXE或DLL调用的DLL

    千次阅读 2019-01-08 17:21:30
    推荐一个分析EXE或DLL文件的工具Dependency Walker Dependency Walker下载地址
  • 最近用avicap32.dll调用摄像头,XP下正常,在win7及以上系统中,黑屏。试着捕获图片,有时可成功。我只要捕获图片,故可另辟蹊径,重写了一个类库,实现了启动摄像头、动态预览、实时抓图、获取分辨率和支持分辨率的...
  • DLL调用(4):JavaCPP调用DLL

    千次阅读 2017-12-12 20:58:35
    JavaCPP调用DLL效率极高,测试表名甚至高于采用JNI调用的结构,也许我的JNI写的有问题,不过足够证明JavaCPP的高效率。 完整示例代码可在 http://download.csdn.net/download/ezhchai/10155929 中下载,起名字为...
  • C++ dll调用-动态(显式)及静态

    千次阅读 2013-06-09 15:29:55
    C++ dll调用-动态(显式) 今天尝试写了一个简单的C++DLL,并且用另一个CPP调用它,啥都不说,先贴代码 1.DLL(冒泡算法) extern "C"_declspec(dllexport) void maopao(int *p,int count); void ...
  • VS2015 MFC DLL调用模式对话框

    万次阅读 2018-12-20 10:54:47
    关于如何创建mfc dll动态链接库以及如何调用在我前面的一篇博客里写的很清楚了,不太清楚的可以去看看,博客地址:VS2015中用C++创建MFC DLL动态库,因此这篇博客里我只讲重点内容。 有的时候我们需要在mfc dll中...
  • MT4中Dll调用详解

    万次阅读 2016-05-25 17:37:43
    1.1 dll简介  动态链接库(Dynamic Link Library或者Dynamic-link library,缩写为DLL),是微软公司在微软视窗操作系统中实现共享函数库概念的一种实作方式。DLL是一个包含可由多个程序同时使用的代码和数据的库...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 43,415
精华内容 17,366
关键字:

dll调用