当前位置:首页>开发>正文

怎样调试动态链接库 C#中如何调用动态链接库

2023-04-21 23:44:36 互联网 未知 开发

 怎样调试动态链接库 C#中如何调用动态链接库

怎样调试动态链接库

在Dll项目的Run->Paramerets中设置Host application,并保证该application调用的是当前Dll项目编译出的dll,然后在Dll项目中设断点debug......

C#中如何调用动态链接库

C#中如何调用动态链接库DLL
C#中能调用非托管c 的dll, C#调用C 编译的DLL详解
www.csframework.com/archive/2/arc-2-20110612-1554.htm

C#调用Delphi编译的DLL函数库返回大文本数据
www.csframework.com/archive/2/arc-2-20110324-1226.htm

如何从LabVIEW调用动态链接库DLL

主要软件版本: 1.0 如果DLL是C/C DLL:找到头文件(*.h) 或者函数原型声明. 确定你需要调用的function(s) . 注意函数的参数是否包含了原始数据类型参数比如int, char, double, 等等或者是否包含了复杂数据类型比如clusters. 如果函数没有包含复杂数据类型并且你有头文件(*.h), LabVIEW中一个很好的工具可以帮你简单地导入DLL (并且会帮助你创建DLL的整个库). 你可以在Tools??Import??Shared Library (.dll)... 中找到该工具 按照向导进行下去. 如何函数不含有复杂数据类型但是没有头文件(*.h), 首先确定你使用的是C/C DLL因为大部分的编程环境将对这种DLL生成头文件. 如果你确实在处理C/C DLL, 找到该函数的相关文档,因为你需要确定那些在DLL中被调用的函数的参数. 一旦参数被确定,使用 Call Library Function Node LabVIEW中的函数手动调用该函数。 如果你需要调用的函数含有复杂的数据类型,你需要手动使用LabVIEW中的 Call Library Function Node功能直接调用, 在配置对话框中添加原型. 注意如果你的复杂数据类型是结构体而不是原始数据类型 (int, double, char), 从基于C的编程语言中创建wrapper DLL. 因为 C/C 结构并不总是与LabVIEW的数据类型相对应的, wrapper DLL 能够近似的解析复杂结构的内容并且把它们翻译成原始类型. 比如,如果在C中的一个结构体包含 char * (字符串或者字符数组), 可以创建一个wrapper function,LabVIEW将直接用char * type 调用它, 把它放在结构体中然后按照顺序调用DLL. 注意如果你有DLL源代码,可以直接修改DLL使得它能够接收一个char * 而不是该结构体. 如果DLL是 .NET assembly:为了在LabVIEW中使用.NET assembly , 简单地使用.NET 面板 (Connectivity??.NET) 找出所有可用的函数. 首先使用结构节点来例示.NET assembly中的一个类. 通过简单地连接结构节点的类引用到属性节点或者调用节点,使用属性节点和调用节点来获取该类的属性和方法 相关链接:附件:报告日期: 2007-07-20

如何调用动态链接库问题,

vc调用dll 收藏 调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同。Windows提供了两种将DLL映像到进程地址空间的方法:1. 隐式的加载时链接
这种方法需要DLL工程经编译产生的LIB文件,此文件中包含了DLL允许应用程序调用的所有函数的列表,当链接器发现应用程序调用了LIB文件列出的某个函数,就会在应用程序的可执行文件的文件映像中加入一些信息,这些信息指出了包含这个函数的DLL文件的名字。当这个应用程序运行时,也就是它的可执行文件被操作系统产生映像文件时,系统会查看这个映像文件中关于DLL的信息,然后将这个DLL文件映像到进程的地址空间。
系统通过DLL文件的名称,试图加载这个文件到进程地址空间时,它寻找DLL 文件的路径按照先后顺序如下:
·程序运行时的目录,即可执行文件所在的目录;
·当前程序工作目录
·系统目录:对于Windows95/98来说,可以调用GetSystemDirectory函数来得到,对于WindowsNT/2000来说,指的是32位Windows的系统目录,也可以调用GetSystemDirectory函数来得到,得到的值为SYSTEM32。
·Windows目录
·列在PATH环境变量中的所有目录
VC中加载DLL的LIB文件的方法有以下三种:
①LIB文件直接加入到工程文件列表中
在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中“Add Files to Project”菜单,在弹出的文件对话框中选中要加入DLL的LIB文件即可。
②设置工程的 Project Settings来加载DLL的LIB文件
打开工程的 Project Settings菜单,选中Link,然后在Object/library modules下的文本框中输入DLL的LIB文件。
③通过程序代码的方式
加入预编译指令#pragma comment (lib,”*.lib”),这种方法优点是可以利用条件预编译指令链接不同版本的LIB文件。因为,在Debug方式下,产生的LIB文件是Debug版本,如Regd.lib;在Release方式下,产生的LIB文件是Release版本,如Regr.lib。
当应用程序对DLL的LIB文件加载后,还需要把DLL对应的头文件(*.h)包含到其中,在这个头文件中给出了DLL中定义的函数原型,然后声明。
2 显式的运行时链接 ,(我用的是此方法)
隐式链接虽然实现较简单,但除了必须的*.dll文件外还需要DLL的*.h文件和*.lib文件,在那些只提供*.dll文件的场合就无法使用,而只能采用显式链接的方式。这种方式通过调用API函数来完成对DLL的加载与卸载,其能更加有效地使用内存,在编写大型应用程序时往往采用此方式。这种方法编程具体实现步骤如下:
①使用Windows API函数Load Library或者MFC提供的AfxLoadLibrary将DLL模块映像到进程的内存空间,对DLL模块进行动态加载。
②使用GetProcAddress函数得到要调用DLL中的函数的指针。
③不用DLL时,用Free Library函数或者AfxFreeLibrary函数从进程的地址空间显式卸载DLL。
例:在应用程序中调用dll文件 ——在应用程序中要首先装入dll后才能调用导出表中的函数,例如用mfc 创建基于对话框的工程test,并在对话框上放置"load"按钮,先添加装载代码。
1.首先在testdlg.cpp的首部添加变量设置代码: //设置全局变量glibsample用于存储dll句柄 HINSTANCE glibsample=null //如果定义成HANDLE类型,则出错//第二个变量showme是指向dll
库中showme()函数的指针typedef int(* Showme)(void)Showme showme2.利用classwizard为"load"按钮添加装载dll的代码 void ctestdlg::onloadbutton() { //要添加的代码如下 if(glibsample!=NULL) {AfxMessageBox("the sample.dll has already been load.") return }//装载sample.dll,未加路径,将在三个默认路径中寻找 (1)windows的系统目录:windowssystem //(2)dos中path所指出的任何目录 //(3)程序所在的目录
glibsample=Loadlibrary("sample.dll") //返回dll中showme()函数的地址 showme=(Showme)GetProcAddress(glibsample,"showme")

JS怎么调用动态链接库


用C 或其他native语言写一个activeX,这个activeX提供一些接口做桥接,比如 dllCall(dllName,procName,param,...)等,然后这个activeX下载到客户端的浏览器(IE)中,让ie载入(ie的安全性设定),然后用浏览器客户端脚本(js)和这个activeX做交互,根据业务逻辑调用具体dll(这些dll可以在本地,也可以远程调用,实现方式在activeX中实现),至于activex如何实现只有靠你自己了,或者找找是否有开源例子.大致思路就是这样的.

如何使用LoadRunner调用外部DLL动态链接库

每一个DLL必须有一个入口点,这就象我们用C编写的应用程序一样,必须有一个WINMAIN函数一样。在Non-MFC DLL中DllMain是一个缺省的入口函数,你不需要编写自己的DLL入口函数,用这个缺省的入口函数就能使动态链接库被调用时得到正确的初始化。如果应用程序的DLL需要分配额外的内存或资源时,或者说需要对每个进程或线程初始化和清除操作时,需要在相应的DLL工程的.CPP文件中对DllMain()函数按照下面的格式书写。

BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
switch( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH:
break
case DLL_THREAD_ATTACH:
break
case DLL_THREAD_DETACH:
break
case DLL_PROCESS_DETACH:
break
default:
break
}
return TRUE
}

如何创建与调用动态链接库

动态链接库:dll不必被包含在最终的EXE中,EXE文件执行时可以动态地引用和卸载DLL文件。
  同时,静态链接库中不能再包含其他的动态链接库或静态库,而动态链接库中可以包含其他的动态或静态库。
  VC 支持的DLL:
  DLL的编制与具体的编程语言及编译器无关,动态链接库随处可见,VC 支持三种DLL:非MFC动态库、MFC规则DLL和MFC扩展DLL。DLL导出函数(或变量、类)可供应用程序调用;DLL内部函数只能在DLL程序内使用,应用程序无法调用它们。
  导出函数的声明方式:
  一种在函数声明类型和函数名之间加上“_declspec(dllexport)”。
  另外一种采用模块定义(.def)文件声明,需要在库工程中添加模块文件,格式如下:
  LIBRARY 库工程名称
  EXPORTS 导出函数名
  DLL的调用方式:
  一种静态调用,由编译系统完成对DLL的加载和应用程序结束时DLL的卸载。
  另外一种动态调用,由编程者用API函数加载和卸载DLL(DLL加载—DLL函数地址获取—DLL释放)方式。
  所有库工程编译时必须Release方式:
  Build—set active configuration—选择库工程的release方式
  示例:
  一、 函数----创建动态链接库(MFC规则DLL)
  1. New--projects--MFC AppWizard(dll)--Regular DLL using shared MFC DLL //取名为MFC_dll
  2. def文件中添加:函数名(Add_new)
  3. h文件中添加:外部函数声明//求和函数,函数名为Add_new
  extern "C" __declspec(dllexport) int __stdcall Add_new(int a,int b)
  4. cpp文件中添加: 外部函数实现
  extern "C" __declspec(dllexport) int __stdcall Add_new(int a,int b)
  {
  return a b
  }
  5. build--set active configuration--win32 release--ok
  6. 生成
  7. 根目录下release文件夹中dll,lib与根目录下h文件即为所需
  二、 函数----调用动态链接库(把MFC_dll.dll和MFC_dll.lib拷到工程所在目录)
  //静态调用(.h可以写到.cpp文件中)
  1. new--projects--win32 console application--an empty project
  2. 添加h文件:(test.h)
  #pragma comment(lib,"MFC_dll.lib") //告诉编译器DLL相对应的lib文件所在路径和文件名
  extern "C" _declspec(dllimport) int _stdcall Add_new(int a,int b)//声明导入函数
  3. 添加cpp文件:(main.cpp)
  #include "test.h"
  int main()
  {
  cout<  return 0
  }
  //动态调用
  #include
  #include
  typedef int (* lpAddFun)(int ,int)//定义一个与Add_new函数接受参数类型和返回值均相同的函数指针类型
  int main()
  {
  HINSTANCE hDll//句柄
  lpAddFun addFun//函数指针
  hDll=LoadLibrary("dllTest.dll")//动态加载DLL模块句柄
  if(hDll)
  {
  addFun=(lpAddFun) GetProcAddress(hDll,"Add_new")//得到所加载DLL模块中函数的地址
  if(addFun)
  {
  int result=addFun(2,3)
  printf("%d",result) } FreeLibrary(hDll)//释放已经加载的DLL模块
  }
  return 0
  }
  三、 变量----创建动态链接库(非MFC DLL)
  1. new---projects---win32 dynamic-link library----an empty project(Sample)
  2. 添加sample.h
  #ifndef SAMPLE_H
  #define SAMPLE_H
  extern int dllGlobalVar
  #endif
  3. 添加 sample.cpp
  #include "sample.h"
  #include
  int dllGlobalVar
  bool APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
  //windows在加载DLL时,需要一个入口函数,就如同控制台或DOS程序需要main函数、win32程序需要winmain函数一样。所以引入一个不做任何操作的缺省DllMain的函数版本。是DLL的内部函数。