调用cdll文件图文讲解|在C语言中怎样调用*dll文件该怎么处理

|

① C中如何调用DLL

dll代码:#include <windows.h>extern "C"void _declspec( dllexport ) Msg(){ MessageBox(NULL,"hello world!","demo",MB_OK);} 编译完成后把dll命名为fuck.dll ,放到 c盘下。调用dll的exe的代码:#include <windows.h>int main(){ HMODULE hdll=LoadLibrary("c:\\fuck.dll"); //加载dll if(hdll!=NULL) { FARPROC proc=GetProcAddress(hdll,"Msg"); if(proc!=NULL) { //proc(); _asm call proc } } return 0;}

② C# 中如何调用DLL文件

C# 中如何调用DLL文件的方法是:

有命名空间则引入命名空间,dll里面,是a命名空间,有一个b类,然后有一个无参数静态方法c那么调用方法就是a.b.c()。然后是非托管dll需要添加dll的名称,以及方法,也就是你所用到的dll的每个方法都需要添加一次,[DllImport("msvcrt.dll")] public static extern int puts(string c);

③ c语言怎么调用dll文件我有一个dll文件,叫“rock.dll”。然后里面有一个函数(不知道是

typedef int(*GetHDiskCode_t)(xxxxxxx);HMODULE hdll;GetHDiskCode_t proc;int main(){xxxxx;hdll=LoadLibrary("rock.dll);proc=(GetHDiskCode_t)GetProcAddress(hdll,"GetHDiskCode");myhdid=(*proc)(xxxxxxxxx);}

④ C+的dll如何用易语言正确调用

在编写程序的时候往往需要调用到别的语言编写的DLL文件,下面先来看一下在易语言中如何调用VC编写的DLL呢,首先用VC编写一个简单的DLL文件,代码如下:int WINAPI add(int x,int y){return x+y;}这是一亏嫌个简单的两个数加法操作,返回两个数相加的结果,这里我生成的是MFC DLL,并且需要在def中导出add函数。下面用易语言来调用它,首先在易语言中需要插入一个DLL命令,代码如下:.版本 2.DLL命令 调用CDLL, 整数型, "cdll.dll", "add" .参数 x, 整数型 .参数 y, 整数型并且保存工程文件与DLL文件在一起,否则可能会报找不到DLL的错误.下面在按钮中添加如下代码:.版本 2.子程序 _按钮1_被单击信息框 (调用CDLL (5, 5), 0, )这样我们传递了两个数后就可以返回结果了,如下图: 上图的信息框显示返回的结果是10,那么这就是正确的了,易语言调用VC的DLL需要注意类型,并且DLL函数需要WINAPI或stdcall,否则也会报错。下面我们再来看一下VC如何调用易语言的DLL,还是先用易语言编写一个DLL文件,建立一个DLL动态链接库工程,新建一个子程序,代码如下:.版本 2.子程序 add, 整数型, 公开.参数 x, 整数型.参数 y, 整数搏悉型返回 (x + y)下面我们用VC来调用这个DLL并且返回结果,代码如下:HINSTANCE hMod = LoadLibrary("e.dll");typedef int(WINAPI *ADD)(int,int);ADD myadd = (ADD)GetProcAddress(hMod,"add");CString str;str.Format("%d",myadd(5,5));MessageBox(str); FreeLibrary(hMod);调用后结果如下图:这样就得到了正确的结果了,需要注意的是易语言子程序必须公开,公开也销银手就是与VC中def文件导出是一样的道理。

⑤ c语言怎么调用dll文件

1、新建DLLTest文件夹,在该文件夹中新建source文件夹。

注意事项:

C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。

⑥ C#调用DLL中 DllImport 属性详解

DLL Import 属性现在是更深入地进行探讨的时候了。在对托管代码进行 P/Invoke 调用时,DllImportAttribute 类型扮演着重要的角色。DllImportAttribute 的主要作用是给 CLR 指示哪个 DLL 导出您想要调用的函数。相关 DLL 的名称被作为一个构造函数参数传递给 DllImportAttribute。如果您无法肯定哪个 DLL 定义了您要使用的 Windows API 函数,Platform SDK 文档将为您提供最好的帮助资源。在 Windows API 函数主题文字临近结尾的位置,SDK 文档指定了 C 应用程序要使用该函数必须链接的 .lib 文件。在几乎所有的情况下,该 .lib 文件具有与定义该函数的系橘码统 DLL 文件相同的名称。例如裤世,如果该函数需要 C 应用程序链接到 Kernel32.lib,则该函数就定义在 Kernel32.dll 中。您可以在 MessageBeep 中找到有关 MessageBeep 的 Platform SDK 文档主题。在该主题结尾处,您会注意到它指出库文件是 User32.lib;这表明 MessageBeep 是从 User32.dll 中导出的。可选的 DllImportAttribute 属性除了指出宿主 DLL 外,DllImportAttribute 还包含了一些可选属性,其中四个特别有趣:EntryPoint、CharSet、SetLastError 和 CallingConvention。EntryPoint 在不希望外部托管方法具有与 DLL 导出相同的名称的情况下,可胡伍肢以设置该属性来指示导出的 DLL 函数的入口点名称。当您定义两个调用相同非托管函数的外部方法时,这特别有用。另外,在 Windows 中还可以通过它们的序号值绑定到导出的 DLL 函数。如果您需要这样做,则诸如“#1”或“#129”的 EntryPoint 值指示 DLL 中非托管函数的序号值而不是函数名。CharSet 对于字符集,并非所有版本的 Windows 都是同样创建的。Windows 9x 系列产品缺少重要的 Unicode 支持,而 Windows NT 和 Windows CE 系列则一开始就使用 Unicode。在这些操作系统上运行的 CLR 将Unicode 用于 String 和 Char 数据的内部表示。但也不必担心 — 当调用 Windows 9x API 函数时,CLR 会自动进行必要的转换,将其从 Unicode转换为 ANSI。如果 DLL 函数不以任何方式处理文本,则可以忽略 DllImportAttribute 的 CharSet 属性。然而,当 Char 或 String 数据是等式的一部分时,应该将 CharSet 属性设置为 CharSet.Auto。这样可以使 CLR 根据宿主 OS 使用适当的字符集。如果没有显式地设置 CharSet 属性,则其默认值为 CharSet.Ansi。这个默认值是有缺点的,因为对于在 Windows 2000、Windows XP 和 Windows NT® 上进行的 interop 调用,它会消极地影响文本参数封送处理的性能。应该显式地选择 CharSet.Ansi 或 CharSet.Unicode 的 CharSet 值而不是使用 CharSet.Auto 的唯一情况是:您显式地指定了一个导出函数,而该函数特定于这两种 Win32 OS 中的某一种。ReadDirectoryChangesW API 函数就是这样的一个例子,它只存在于基于 Windows NT 的操作系统中,并且只支持 Unicode;在这种情况下,您应该显式地使用 CharSet.Unicode。有时,Windows API 是否有字符集关系并不明显。一种决不会有错的确认方法是在 Platform SDK 中检查该函数的 C 语言头文件。(如果您无法肯定要看哪个头文件,则可以查看 Platform SDK 文档中列出的每个 API 函数的头文件。)如果您发现该 API 函数确实定义为一个映射到以 A 或 W 结尾的函数名的宏,则字符集与您尝试调用的函数有关系。Windows API 函数的一个例子是在 WinUser.h 中声明的 GetMessage API,您也许会惊讶地发现它有 A 和 W 两种版本。SetLastError 错误处理非常重要,但在编程时经常被遗忘。当您进行 P/Invoke 调用时,也会面临其他的挑战 — 处理托管代码中 Windows API 错误处理和异常之间的区别。我可以给您一点建议。如果您正在使用 P/Invoke 调用 Windows API 函数,而对于该函数,您使用 GetLastError 来查找扩展的错误信息,则应该在外部方法的 DllImportAttribute 中将 SetLastError 属性设置为 true。这适用于大多数外部方法。这会导致 CLR 在每次调用外部方法之后缓存由 API 函数设置的错误。然后,在包装方法中,可以通过调用类库的 System.Runtime.InteropServices.Marshal 类型中定义的 Marshal.GetLastWin32Error 方法来获取缓存的错误值。我的建议是检查这些期望来自 API 函数的错误值,并为这些值引发一个可感知的异常。对于其他所有失败情况(包括根本就没意料到的失败情况),则引发在 System.ComponentModel 命名空间中定义的 Win32Exception,并将 Marshal.GetLastWin32Error 返回的值传递给它。如果您回头看一下图 1 中的代码,您会看到我在 extern MessageBeep 方法的公共包装中就采用了这种方法。CallingConvention 我将在此介绍的最后也可能是最不重要的一个 DllImportAttribute 属性是 CallingConvention。通过此属性,可以给 CLR 指示应该将哪种函数调用约定用于堆栈中的参数。CallingConvention.Winapi 的默认值是最好的选择,它在大多数情况下都可行。然而,如果该调用不起作用,则可以检查 Platform SDK 中的声明头文件,看看您调用的 API 函数是否是一个不符合调用约定标准的异常 API。通常,本机函数(例如 Windows API 函数或 C- 运行时 DLL 函数)的调用约定描述了如何将参数推入线程堆栈或从线程堆栈中清除。大多数 Windows API 函数都是首先将函数的最后一个参数推入堆栈,然后由被调用的函数负责清理该堆栈。相反,许多 C-运行时 DLL 函数都被定义为按照方法参数在方法签名中出现的顺序将其推入堆栈,将堆栈清理工作交给调用者。幸运的是,要让 P/Invoke 调用工作只需要让外围设备理解调用约定即可。通常,从默认值 CallingConvention.Winapi 开始是最好的选择。然后,在 C 运行时 DLL 函数和少数函数中,可能需要将约定更改为 CallingConvention.Cdecl。

⑦ c语言怎么调用dll文件

由于c的sdk编程的时候调用的api也应该是从dll中导出来的,这样c应该也是内能调用dll的,c语言调用dll文件容内部函数的方法如下:1:用c调用一个加载器LOADER<可能是个api函数>;2:加载目标dll,比如xx.dll3:找到需要调用的函数的地址P_FUNC4:调用FUNC即可

⑧ 在C语言中怎样调用*dll文件,该怎么处理

生成动态库文件后,那么debug目录下会同时又.lib和.dll文件。而你的程序中只需加入#pragma comment(lib, "xxxx.lib")就可以调用。这个回是微软的答调用方法。在linux下是.so文件;要设置环境变量。话说看书了解下更快。

⑨ C程序如何调用dll 文件

用的来IDE不一样,生成DLL文件源的方法也有差异,建议上网查找你所用的IDE生成DLL文件的方法。 ***********************************************这个关键是IDE(比如是VC++还是BCB),C语言在编DLL和其它的程序时都用相同的规则。 ***********************************************看不懂建议暂时就不要自己做了,在这里说和你看网上资料是一样的,而且这里可以说的内容还不及网上多呢。

⑩ 如何用C#调用C编写的dll

使用C#生成dll文件并调用一、创建dll文件:例如生成一个md5编码判断状态的文件,即,输入一个字符串(string A)和一个32位md5编码(string B),判断此字符串A对应的32位md5编码是否与B相等,如果槐郑相等返回true,否则返回false。打开VS 2005,“文件”–》“新建”–“项目”,选择“Windows 控件库”,命名后点击“确定”,在“UserControl1.cs”中输入以下代码:using System;using System.Collections.Generic;using System.ComponentModel;using System.Drawing;using System.Data;using System.Windows.Forms;using System.Text;using System.Security.Cryptography;namespace md5{public partial class Program : UserControl{#region MD5 32位加密:GetMd5Str32/// <summary>/// 32位MD5加密/// </summary>/// <param name="strSource">待加密字串</param>/// <returns>加密后的字串</returns>public static string GetMd5Str32(string strSource){byte[] bytes = Encoding.ASCII.GetBytes(strSource);byte[] hashValue = ((System.Security.Cryptography.HashAlgorithm)System.Security.Cryptography.CryptoConfig.CreateFromName("MD5")).ComputeHash(bytes);StringBuilder sb = new StringBuilder();for (int i = 0; i < 16; i++){sb.Append(hashValue[i].ToString("兄明埋x2"));}return sb.ToString().ToUpper();}#endregion#region 核对md5编码是否一致:CheckMd5String()/// <summary>/// 核对md5编码是否一致/// </summary>/// <param name="ConvertString"></param>/// <returns>如果一致返回true,否则返回false</returns>///public static bool CheckMd5String(string str1, string str2){string md5String = str1; //需要验证的字符串string md5DbString = str2; //需要核对的32位md5编码int result = string.Compare(md5.Program.GetMd5Str32(str1), md5DbString, true);if (result == 0){return true;}else{return false;}}#endregion}}修改“UserControl1.Designer.cs”中的命名空间为“md5”,方法为“Program”,即可生成dll文件。在…\bin\Debug文件假下,可以找到相应的dll文件。二、部署dll流程:首先把dll文件放到应用程序…\bin\羡蚂Debug\下;然后在解决方案中添加引用:右键鼠标–>添加引用–>浏览–>选择dll放置路径后点击“确定”。注意:要在应用文件头处使用using md5;命令。测试应用程序代码,如下:Form1.csusing System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using md5;namespace WindowsApplication1{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){string str1 = textBox1.Text.ToString();string md5String = textBox2.Text.ToString();textBox3.Text = md5.Program.GetMd5Str32(str1);textBox4.Text = md5.Program.CheckMd5String(str1, md5String).ToString(); }private void button2_Click(object sender, EventArgs e){this.Close();}}}三、注意点:1、在C#应用程序开发过程中,加载dll文件时,报错“未能加载文件或程序集“md5, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。系统找不到指定的文件。”,请指点一下是什么原因?解决:这是因为加载dll的路径问题,正确加载方式为:在“解决方案”的“引用”文件上右击鼠标,选择“添加引用”—》在“浏览”选项卡中添加引用(注意:自己定义的dll文件不能在“.NET”选项卡中添加。)


赞 (0)