Windows下C语言调用dll动态链接库

dll是windows下的动态链接库文件,下面记录一下在windows下如何调用C语言开发的dll动态链接库。

1.dll动态链接库的源代码

hello_dll.c

#include "stdio.h"

_declspec(dllexport) void test_print(char const *str)
{
    printf("%s\n", str);
}

_declspec(dllexport) int test_add(int a, int b)
{
    return a + b;
}

上面的代码定义了两个函数,第一个函数需要传入一个字符串,然后打印出这个字符串,第二个函数需要转入两个int型整数,然后返回这两个整数的和。

执行 cl -LD hello_dll.c 会生成hello_dll.dll文件

2.main函数的源代码

test_hello_dll.c

#include <stdlib.h>
#include <windows.h>

int main(int argc, char const *argv[])
{
    // define two functional pointer
    void(*p_test_print)(char const *) = NULL;
    int(*p_test_add)(int, int) = NULL;

    int add_result;

    // load dll file, require window.h file
    HMODULE module = LoadLibraryA("hello_dll.dll");
    if (module == NULL) {
        system("error load");
    }
    p_test_print = (void(*)(char const *))GetProcAddress(module, "test_print");
    p_test_add = (int(*)(int, int))GetProcAddress(module, "test_add");
    if (p_test_print != NULL) {
        p_test_print("Hello This is from dll");
    } else {
        system("function p_test_print can not excute");
    }
    if (p_test_add != NULL) {
        add_result = p_test_add(5, 5);
        printf("Add result is %d\n", add_result);
    } else {
        system("function p_test_print can not excute");
    }
    FreeLibrary(module);
    system("pause");
    return 0;
}

执行 cl test_hello_dll.c 会生成test_hello_dll.exe的可执行文件。

运行该文件,可以成功调用dll文件中定义的函数。

时间: 2024-11-06 03:41:54

Windows下C语言调用dll动态链接库的相关文章

[学习记录]使用C#语言调用.dll(动态链接库)文件

不可全信 感谢各位博客教会了我很多,我也要写出来参与社区建设. 嘛不一定完全正确,想要可靠性比较高的同志建议买书,书中出处啥的比较详细,可靠性比较高. --------------------- 1.基本步骤 1.1 向项目中导入dll文件 1.2 阅读dll文件的使用手册 [ 和头文件(.H) ] 1.3 编写导入dll文件中方法的代码 1.4 编写读取dll中对应数据的代码(可能略) 1.5 写方法调用dll中方法并加以判断调用是否成功 1.6 在相关位置调用使用自己定义的调用方法 2.基本

VS2015环境下生成和调用DLL动态链接库

一.生成动态链接库: 1.打开VS2015->文件->新建->项目->Visual C++->Win32->Win32控制台应用程序->将名称改为dll_generate->确定 2.出现Win32应用程序向导->下一步->在"应用程序类型"中选择"DLL"->在"附加选项"中选择"空项目"->完成 3.视图->解决方案管理器->右键"

windows下,python调用dll例子,展示如何传递字节码流参数到dll接口

工作上需要用python调用dll解析码流输出到文件,如何调用dll很多博客都有描述,请参考如下blog: 如何调用请参考: http://blog.csdn.net/lf8289/article/details/2322550 WinDLL和CDLL的选择,请参考: http://blog.csdn.net/jiangxuchen/article/details/8741613 传递自定义的结构,请参考: http://www.jb51.net/article/52513.htm 但是如何将一

Windows下C语言的Socket编程例子(TCP和UDP)

一.  <TCP> server端: 1 #include "stdafx.h" 2 #include <stdio.h> 3 #include <winsock2.h> 4 5 #pragma comment(lib,"ws2_32.lib") 6 7 int main(int argc, char* argv[]) 8 { 9 //初始化WSA 10 WORD sockVersion = MAKEWORD(2,2); 11 W

在Windows中实现Java调用DLL(转载)

本文提供调用本地 C 代码的 Java 代码示例,包括传递和返回某些常用的数据类型.本地方法包含在特定于平台的可执行文件中.就本文中的示例而言,本地方法包含在 Windows 32 位动态链接库 (DLL) 中. 不过我要提醒您,对 Java 外部的调用通常不能移植到其他平台上,在 applet 中还可能引发安全异常.实现本地代码将使您的 Java 应用程序无法通过 100% 纯 Java 测试.但是,如果必须执行本地调用,则要考虑几个准则: 将您的所有本地方法都封装在单个类中,这个类调用单个

windows下使用c++调用redis

不废话,unix下c++调用 redis可以看这个: http://blog.csdn.net/youngqj/article/details/8266177 redis的官网版本并没有为vc开发提供接口,不过微软对redis好像很感兴趣,自己弄了一个 ,完整的英文说明在这里: https://gist.github.com/MS-Interop/1439660    根据说明,一套完整下来,你就可以自己搭一个VC版本的 redis. 因为流程比较复杂,怕以后自己要用又忘记,趁记得写下来. 1.

VBA 调用DLL动态链接库

在ArcMap中引用动态链接库       我在VB6下编译生成了一个动态链接库文件VBAPrj.dll,其中有一类模块VBACls,此类模块有一个方法Test(Doc As Object).        常见的方法有三种(作者:张业新): 1.打开VBA编辑器,点"工具"菜单下的"引用"命令,在引用对话框中引用该动态链接库.        调用代码如下:          Dim VBACls As New VBAPrj.VBACls          VBAC

windows下R语言在终端的运行

在windows下可以有多种方式来运行R,R导论的这些章节给出一些详细的指导. 通常在环境变量离包含R的安装目录类似于R\R-3.1.2\bin\x64的情况下,就可以在CMD下运行R程序了 注意我这里是64bit环境,R.exe在R\R-3.1.2\bin下也存在,但是包含这个目录会导致调用R.exe失败,想要确定到底是哪一个,只要双击那个可执行程序,如果可以运行出现R语言的RPEL那就是那个的: 那个R\R-3.1.2\bin\x64目录下包含很多可执行程序 R与Rterm打开的都是Rter

关于Linux和Windows下部署mysql.data.dll的注册问题

mysql ado.net connector下载地址: http://dev.mysql.com/downloads/connector/net/ 选择版本: Generally Available Releases(1)是发布版(bug什么的较少的版本吧),而Development Releases(2)是开发版 我们采用1版本 Windows (x86, 32-bit), MSI Installer 该版本是window下的安装版,如果你安装了这个版本的话,在本机调试的时候可以不用再次注册