作为dll的初学者,从自身的角度来说一下dll带给我的个人感觉。
1.感觉相当于一个可移动的方法集合,里面可以写各种方法,只要可以进行成功的调用,就可以完全使用其中的方法。
2.支持多种语言,因为做这个有一段时间了,现在发现c#也可以调用c++的dll,说明dll的可移植性很强。
话不多说,咱们直接进行调用步骤:
(1)先说比较直接,同时也是静态的调用(个人感觉最快,但是貌似很死板)
首先你得创建一个dll文件
头文件这里你想怎么写都可以,大部分都是写自己需要的。 当然我在这里偷懒了,其实要是使整个界面更加整洁的话,可以新建一个Caculate的头文件这个头文件当中,在下面同样建立一个对应的cpp执行文件。这样你就更加分类清晰(我也是后来才发现的,刚才是没意识到)例如下面这样,添加的方式:鼠标右键头文件,选择.h的文件类型,然后自己起名,下面的cpp文件也是一样。
回到刚才说的创建dll文件,头文件按着要求写好了,extern "C" _declspec (dllexport) 这句话的意思使按着c语言的格式导出。下面我们写cpp文件,
这里的这个头文件相当于上面你写的那个所有头文件的集合,因为我上面偷懒了,我把需要的头文件都写在pch.h下面了,所以这里也是用的pch.h。如果你上面改了你就用Caculate.h(当然pch.h也不能少)。
做示范,我就随便写了一个字符串合成(偷懒之王)。然后选择解决方案,鼠标右键选择重新生成,dll这头就完成了。
我们创建一个c++的控制台去调用它。在控制台可没有什么头文件的单独集合,直接上程序
在这里注意两点,一个是#pragma comment(lib,"DLL.lib") 这个需要是你的dll文件名称,后面的那个lib先不用管。
另外一个是extern "C" _declspec (dllimport) string sincity(string Name, double num1, double num2);,前面写的是dllexport,现在改成了dllimport。‘
然后我们找到刚才的那个dll文件,右键解决方案---》在文件资源管理器当中打开文件夹---》Debug---》看到.dll和.lib两个文件,如图
选择他们俩,复制。
然后找到你写的控制台文件,同样在文件资源管理器当中打开文件夹,然后找到你的控制台名称文件夹(我写的是TestDLL)
点击进去,直接把刚才那两个文件直接进行复制。 运行搞定。
上述方法简单粗暴,适合调试的时候暴力使用,但是个人觉得不适合编程(高大上的程序员)。所以我在dll文件当中,右键我写的那个dll文件(我起的名字就叫DLL),找到属性,然后常规下面的输出目录我直接改为了上述控制台粘贴lib和dll的那个文件夹路径。在这里你要注意写的是绝对路径还是相对路径,绝对路径的话,传给别人用可能会报错(个人建议写成相对路径)。
上述就是第一种,粗暴的写法,下面我们用一种温柔(复杂)的方法。或许“温柔的一半是知识”这句话的道理就是这样。
为了简化操作,我就直接把上面的那个dll配置文件全部还原如初,同时我也把复制过去的文件进行删除(偷懒本质)。
另一种方式,同上先将dll文件当中的.dll文件拷贝在当前控制台的文件下(与上述方法少复制了一个.lib文件,不要感觉不如上述方法),然后进行编写控制台代码
在这里不需要导出文件名称了,直接利用"window.h"直接进行查找(只要你记忆力足够好记得dll里面的各种函数名和dll名称那么你想调用就调用,想删除就删除,保证不会报错)。 为了懒懒的我,直接给大家一个模板
HINSTANCE hInst;//hInst 随便换,想叫啥就叫啥
hInst = LoadLibrary(L"DLL.dll");//里面DLL.dll得和你之前写的dll文件名称一致(其实就是你复制过来的那个文件)
typedef string(*ADDPROC)(string name, double num1, double num2);//这里主要是你的那个函数的返回类型和需要参数类型 至于ADDPROC这个不能改
ADDPROC Sincity = (ADDPROC)GetProcAddress(hInst, "sincity");//sincity是我的那个调用函数名不能改,前面的那个Sincity随便改叫啥都行
if (!Sincity)
return -1;
大家发现没有,这个控制台只需要对面给一个dll,其他什么都不要配置,直接干就完了。当然偷懒的我还是喜欢直接改了输出目录,省的我每次来回复制。这次先写这个C的控制台调用c++dll,下次写C#的控制台调用c++dll。本人小白(大懒)一名,初学DLL,如果有不对的地方,希望大家多多指教。在此谢谢大家了。在这个现实的社会中,灾难总是接踵而来,以为叫一声救命就会有人来救你吗?错! 因为关键时刻总是要靠自己!
作为dll的初学者,从自身的角度来说一下dll带给我的个人感觉。1.感觉相当于一个可移动的方法集合,里面可以写各种方法,只要可以进行成功的调用,就可以完全使用其中的方法。2.支持多种语言,因为做这个有一段时间了,现在发现c#也可以调用c++的dll,说明dll的可移植性很强。话不多说,咱们直接进行调用步骤:(1)先说比较直接,同时也是静态的调用(个人感觉最快,但是貌似很死板)首先你得创建一个dll文件头文件这里你想怎么写都可以,大部分都是写自己需要的。当然我在这里偷懒了,..
1、导出C函数以用于C或
C++
的项目
如果使用C语言
编写
的
DLL
,希望从中导出函数给C或
C++
的模块访问,则应使用 __cplusplus 预处理器宏确定正在编译的语言。如果是从
C++
语言模块使用,则用C链接声明这些函数。如果使用此技术并为
DLL
提供头
文件
,则这些函数可以原封不动地由C和
C++
模块使用。
以下代码演示可由 C 和
C++
客户端应用程序使用的头
文件
:
// MyCFunc...
C#引用C/
C++
DLL
的两种方法前言方法1:常用的
DLL
Import方法方法2:CLR封装法
工作中,需要给客户提供公司产品的.NET动态库,但驱动工程师往往只提供C编译的库,这里就需要我做一些中间工作,方便客户使用我们的产品。
方法1:常用的
DLL
Import方法
一般这种方法用于
调用
非托管动态库,很常见,这里我就不做赘述,推荐一个好用的网站方便大家做参考, 链接: pinvoke.ne...
注意事项:用
Dll
Import 属性修饰的方法必须具有 extern 修饰符。
1、使用步骤可分为:
C++
的
dll
文件
导入、
C++
的
dll
函数重写、C#
调用
C++
的函数:
(1)导入库
文件
:C#中要引用
C++
的
dll
,需要使用函数“
Dll
Import”,添加其作用域:using System.Runtime.InteropServices;
Dll
Import属性应用于方法,要求最少要提供包含入口点的
dll
的名称。..
1. 创建
C++
DLL
文件
首先,您需要创建一个
C++
动态链接库(
DLL
)
文件
,其中包含您想要在 Python 中使用的
C++
函数。下面是一个简单的示例,演示如何在 Visual Studio 中创建一个简单的
DLL
文件
:
```cpp
// Sample
DLL
.cpp
#include "pch.h"
#include "Sample
DLL
.h"
extern "C"
int add(int x, int y)
return x + y;
请注意,我们使用 `extern "C"` 来告诉编译器使用 C 语言的函数命名规则,以便在 Python 中
调用
。
2. 编译
DLL
文件
使用 Visual Studio,您可以将上述代码编译为
DLL
文件
。在生成
DLL
文件
之前,您需要将项目属性中的运行库设置为“多线程
DLL
(/MD)”。
3. 在 Python 中使用 ctypes
调用
DLL
在 Python 中,您可以使用 `ctypes` 模块来
调用
DLL
中的函数。下面是一个简单的示例:
```python
import ctypes
# 加载
DLL
文件
sample_
dll
= ctypes.C
DLL
('Sample
DLL
.
dll
')
#
调用
DLL
中的函数
result = sample_
dll
.add(1, 2)
# 输出结果
print(result)
在上面的示例中,我们首先使用 `ctypes.C
DLL
()` 函数加载
DLL
文件
。然后,我们可以使用 `sample_
dll
.add()` 来
调用
DLL
文件
中的 `add()` 函数。最后,我们输出了结果。
请确保在加载
DLL
文件
时使用正确的
文件
名和路径。如果
DLL
文件
不在当前工作目录中,则需要指定完整路径。
希望这个示例能够帮助您了解如何在 Python 中使用 `ctypes`
调用
C++
编写
的
DLL
文件
。