如何生成DLL文件并导出函数及如何在C++或C#中调用DLL中导出的函数
2016-12-05 13:34
706 查看
关于DLL的含义和优点,不是本文讨论的重点,这里我们仅讨论如何用C++生成DLL文件,并导出函数。
首先:在VS中创建工程的时候,要选择VC++(我只会用C++来生成DLL文件)语言,然后选择win32再选择win32项目,如下图所示:
注意,在接下来的过程中,需要选择dll.点击完成创建工程。
工程创建完成后,里面会有很多文件,打开源文件目录下的 工程名.cpp文件(其他文件都不用管)
在此文件中编写代码如下:
#include "stdafx.h"
#include<iostream>
using namespace std;
extern "C" int _declspec(dllexport) add(int a ,int b)
{
return a+b;
}
注意上面用红体字标出的部分,这部分代码将告诉编译器此函数将作为导出函数。对于其他函数可以依此类推。点击编译按钮就编译出了dll文件。另外要说明的是,这是一种比较简单的生成dll文件的方法,不用导出函数的名称及其入口点。
至此,dll文件就已经生成了。
我们可以再任何语言中测试此dll文件。以下仅提供C++和C#语言中调用DLL中函数的方法。
在C++中,我们可以用如下方法调用DLL文件中的函数。
#include<windows.h>
#include<stdio.h>
#include<iostream>
using namespace std;
typedef int(__stdcall *fun)(int,int);//声明函数指针
int main()
{
HINSTANCE handle = LoadLibraryA("test.dll");//加载dll文件
fun add=NULL;
add=(fun)GetProcAddress(handle,"add");//导出函数
int a,b;
cin>>a>>b;
cout<<add(a,b)<<endl;
system("pause");
return 0;
}
在C#中,调用DLL文件中的函数同样很简单。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace TEST_DLL
{
class Program
{
[DllImport("test.dll", EntryPoint = "add")]
public static extern int add(int a,int b);
static void Main(string[] args)
{
int a = 108, b = 109;
int c = add(a, b);
Console.WriteLine(c);
Console.Read();
}
}
}
注意,以上在加载dll文件的时候,按照我的写法,dll文件必须和可执行程序在同一目录下,否则会出现找不到dll文件的运行错误。当然,也可以应用dll文件的绝对路径。另外对于user32.dll等系统常用的dll文件,即使没有放到可执行程序的相同路径下,也没有引用其绝对路径,编译器也是能够找到此文件的。
首先:在VS中创建工程的时候,要选择VC++(我只会用C++来生成DLL文件)语言,然后选择win32再选择win32项目,如下图所示:
注意,在接下来的过程中,需要选择dll.点击完成创建工程。
工程创建完成后,里面会有很多文件,打开源文件目录下的 工程名.cpp文件(其他文件都不用管)
在此文件中编写代码如下:
#include "stdafx.h"
#include<iostream>
using namespace std;
extern "C" int _declspec(dllexport) add(int a ,int b)
{
return a+b;
}
注意上面用红体字标出的部分,这部分代码将告诉编译器此函数将作为导出函数。对于其他函数可以依此类推。点击编译按钮就编译出了dll文件。另外要说明的是,这是一种比较简单的生成dll文件的方法,不用导出函数的名称及其入口点。
至此,dll文件就已经生成了。
我们可以再任何语言中测试此dll文件。以下仅提供C++和C#语言中调用DLL中函数的方法。
在C++中,我们可以用如下方法调用DLL文件中的函数。
#include<windows.h>
#include<stdio.h>
#include<iostream>
using namespace std;
typedef int(__stdcall *fun)(int,int);//声明函数指针
int main()
{
HINSTANCE handle = LoadLibraryA("test.dll");//加载dll文件
fun add=NULL;
add=(fun)GetProcAddress(handle,"add");//导出函数
int a,b;
cin>>a>>b;
cout<<add(a,b)<<endl;
system("pause");
return 0;
}
在C#中,调用DLL文件中的函数同样很简单。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace TEST_DLL
{
class Program
{
[DllImport("test.dll", EntryPoint = "add")]
public static extern int add(int a,int b);
static void Main(string[] args)
{
int a = 108, b = 109;
int c = add(a, b);
Console.WriteLine(c);
Console.Read();
}
}
}
注意,以上在加载dll文件的时候,按照我的写法,dll文件必须和可执行程序在同一目录下,否则会出现找不到dll文件的运行错误。当然,也可以应用dll文件的绝对路径。另外对于user32.dll等系统常用的dll文件,即使没有放到可执行程序的相同路径下,也没有引用其绝对路径,编译器也是能够找到此文件的。
相关文章推荐
- C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)
- C# 如何调用 C++ DLL中的函数接口和回调函数
- C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)
- 如何通过C#调用OpenCV函数(自制OpenCV的c++ dll文件)
- C#静态调用C++Dll导出函数,并在C++Dll中回调C#函数
- C#中调用C++的dll的参数为指针类型的导出函数
- C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)
- C#调用C++ dll导出函数提示找不到指定模块 by:凉游浅笔深画眉 / Net7Cracker
- C#与DLL和COM的混合编程(1)-C#调用C++写的非托管的DLL中导出的函数
- C#与DLL和COM的混合编程(1)-C#调用C++写的非托管的DLL中导出的函数
- C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)
- C# 调用Dll中非托管C++代码时,函数参数的类型对照
- 在C#中如何调用C++编写的DLL
- C# 调用 C++ dll 函数 时传递字符串 需要注意的问题
- 用VS2008生成C++代码的dll及在C#中的调用及常见的类型转换
- C#如何调用C++的DLL
- 函数调用,C# 调用Dll中非托管C++代码时,函数参数的类型对照
- 在c#中调用c++里导出的DLL之相关说明
- C# 调用Dll中非托管C++代码时,函数参数的类型对照
- C#调用C++写的dll 函数传递参数问题,请有经验的人详细描述