C程序如何调用dll 文件

C程序如何调用dll 文件,第1张

创建dll工程,工程名定为dll,新建并添加头文件dllDemo.h

//dlldemo.h

#ifdef __cplusplus

#define EXPORT extern "C" __declspec(dllexport)

#else

#define EXPORT __declspec(dllexport)

#endif

EXPORT int add(int a,int b)

EXPORT int sub(int a,int b)

新建并添加源文件dllDemo.c

//dlldemo.c

#include <windows.h>

#include "dlldemo.h"

int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved) {

return TRUE

}

EXPORT int add(int a,int b) {

return a+b

}

EXPORT int sub(int a,int b){

return a-b

}

编译成功后会生成一个dll文件。

再新建一个普通的win32 console工程,工程属性里面的字符集要设为多字节镇棚亏,不要使用Unicode。将dll文件放到目录下面。新建并添加main.c

#include <WINDOWS.H>

#include <WINBASE.H>

#include <stdio.h>

typedef int (*MYPROC)(int, int)

int main()

{

HINSTANCE LibHandle

MYPROC ProcAdd,ProcSub

char dllbuf[] = "dll.dll"//dll的路御神径

char sysbuf[] = "add" /*过程名*/

char sysbuf1[] = "sub"

LibHandle = LoadLibrary(dllbuf) /*载入和埋dll*/

ProcAdd = (MYPROC)GetProcAddress(LibHandle, sysbuf) /*获取函数sysbuf的地址*/

ProcSub = (MYPROC)GetProcAddress(LibHandle, sysbuf1)

printf("%d\n",(ProcAdd)(3,6))

printf("%d\n",(ProcSub)(3,6))

}

编译执行便可成功。

1:新建安装部署项目 打开VS,点击新建项目,选择:其他项目类型->安装与部署->安装向导(安装项目也一样),然后点击确定.(详细见下图) 2:安装向导 关闭后打开安装向导,点击下一步,或者直接点击完成. 如下图: 3:开始制作旁携 安装向导完成后即可进入项目文件夹雀纤: 双击"应用程序文件夹"在右边的空白处右击,选择添加->文件,将你的做的应用程序的可执行文件和相应的类库和组件添加进来. 然后右击你的可执行文件,创建快捷方式,然后把快捷方式分别剪切或复制到左边的"用户的'程序'菜单"和"用户桌面"中. 这样安装程序安装安装完成后会在 "开始->所有程序"和"桌面"上生成程序的快捷方式. 然后右击左边的"应用程序文件夹"打开属性对话框: 将属性中的"defaultlocation"的路径中的"[manufacturer]"去掉, 不然的话做好的安装程序默认安装目录会是"c:\programm file\你的用户名\安装解决方案名称"修改后如图: 然后打开解决方案管理器,右击你的解决方案名称,选择属性: 在打开的属性页中,选择"系统必备", 在打开的系统必备页中,选中如下中的选择项,这个很重要!!!!!1!!!!! 选上以后,在生成的安装文件包中包含.netframework组件.(这个选项默认是没有选中的) 好了,这样就完成99%了顷启仿,然后点击"生成->生成解决方案",哈,生成成功! 4:制作完成 现在打开解决方案文件夹下的debug文件夹,就可以看到生成的安装文件了.

网上 的一篇文章,看完应该对你有所帮助

再谈在VB中调用VC++开发的DLL

作者:未知 来源:月光软件站

近日开发一个程序,明森用到动态链接库,在VB中调用时遇到了一些问题。我查了一些资料,也看了一下CSDN上的文章,感觉这些文章对在VB中调用VC++开发的DLL这一问题阐述得不够详细。因此在我的问题得到解决之余,特为初接触DLL的朋友们写下这篇文章。

本文中关于调用约 定的解决方法,也适用于解决其它编程语言之间DLL调用的兼容问题。

①关于DLL的创建与调用

使用VC++的向导即可。具体 *** 作如下:打开菜单“File\New”→选择“Projects\Win32 Dynamic-Link Library”→选择“A simple DLL project”即可。这时系统会自动生成3个文件:*.cpp,stdafx.cpp,stdafx.h。

之后将入口函数DLLMain()补充完整,再添加你自定义的函数的代码。如果你自定义的函数很多,可以将这些函数的声明部分统一写入一个头文件中。再在.cpp文件首部用“# include”语句引入这个头文件。注意函数声明前要加上“__declspec(dllexport)”。

(如果你建DLL时选择的是第三种类型(加入示例代码),则在函数声明及定义前都要加上系统定义的宏“*_API”。)

在VB中用如下语句声明:“Declare Function 函数名 Lib "完整路径\文件名.dll" [Alias "函数别名"] (ByVal 变量1 As 类型1, ByVal 变量2 As 类型2,…) As 类型3”,与调用API函数类似。

注意:若在窗体代码的“通用”部分使用,“Declare”前要加“Private”;若在Moudle中使用,“Declare”前要加“Public”。若将DLL文件放在“\Windows\System”或“\WinNT\System32” 目录下,“Lib”后只写出DLL主文件名即可。

具体的实例代码见④(修正后的,可直接运行)。

②关于入口点

如上编写Cipher.dll,运行,出现错误信息“找不到DLL入口点(Error 53)”。出现这一错误的原因是C++编译器在编译时对函数名备枣Encrypt作了修改。打开快速查看程序(D:\WINNT\System32\Viewers\QuikView.exe),将Cipher.dll拖激滚亩入查看窗口,找到字段“?Encrypt@@YAHHH@Z”,发现函数名被加了 一串字符。

解决方法有二。第一,直接在VB声明中将“?Encrypt@@Y AHHH@Z”作为别名放在“Alias”后即可;第二,在Cipher.dll代码中在语句“__declspec(dllexport) int __stdcall Encrypt(int p, int k)”前加上“extern "C" ”,编译后,用QuikView查看,函数名变为“_Encrypt”,之后再在VB声明中做相应调整即可。

(对于使用宏的DLL,在“#define”语句中,对宏“Cipher_API”的替换值做更改即可。)

进行了③的更改后,程序又找不到入口点了。再用QuikVie w查看,发现函数名变为“_Encrypt@8”。还有解决方法。在Cipher.dll工程中添加一个文本文件,命名为“Cipher.def”,添加代码如④。编译后再用QuikView查看,函数名变回“Encrypt”,在VB中调用,运行正常。

③关于调用约定

采用②中第二种解决方法,运行,出现错误信息“DLL调用约定错误(Error 49)”。原因是调用约定共有4种方式:__fastcall、__pascal、__stdcall、__cdecl,VC++默认调用方式为__cdecl,而VB默认调用方式则为__stdcall。解决方法是,更改代码如下(限定调用方式):

extern “C” __declspec(dllexport) int __stdcall Encrypt(int p, int k)

…………

int __stdcall Encrypt(int p, int k)

{

int c = p+k

return c

}

④源代码

Cipher.dll:

Cipher.cpp:

//引入预编译头文件

#include “stdafx.h”

//声明我的函数

extern “C” __declspec(dllexport) int __stdcall Encrypt( int p, int k )

//DLL入口函数

BOOL APIENTRY DllMain( HANDLE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved

)

{

switch( ul_reason_for_call )

{

case DLL_PROCESS_ATTACH:

case DLL_THREAD_ATTACH:

case DLL_THREAD_DETACH:

case DLL_PROCESS_DETACH:

break

}

return TRUE

}

//我的函数

int __stdcall Encrypt ( int p, int k )

{

int c = p + k

return c

}

Cipher.def:

LIBRARY Cipher

EXPORTS Encrypt

编译后,将Cipher.dll复制到“D:\WINNT\System32”目录。

在VB中调用:

Option Explicit

Private Declare Function Encrypt Lib “Cipher” _

(ByVal p As Long, ByVal k As Long) As Long

Private Sub Form_Load()

Dim c As Long

c = Encrypt(24, 8)

Text1.Text = c


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12563431.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-26
下一篇2025-08-26

发表评论

登录后才能评论

评论列表(0条)

    保存