(1)用C++builder6调用DLL
用VC2015创建包含MFC库的DLL,如果是给C++Builder6使用,步骤如下:
1、工程属性==》C++==》高级==》调用约定 选项为:__stdcall (/Gd)
2、VC++2015中的函数声明如下:
extern "C" __declspec(dllexport) VOID __stdcall CreateMeter(const char* szTypeName);
3.VC++2015的def文件,EXPORTS可以不用写,因为C++Builder6不用到这个.lib文件
不过,我发现要导出函数,需要在def字声明,否则在其他语言中找不到函数,提示错误.
4.在C++Builder6中,需要重新导出DLL的引导库.lib,方法如下:
implib my.lib my.dll
在BCB6工程中引入my.lib,同时添加函数声明,也就是VC2015DLL中的函数声明(与第2步相同)
(2)用Delphi7调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
unit ScaleWeight_dll;
interface procedure CreateMeter(xktype: PChar ;
No: integer ;
Comm: integer ;
baud: integer ;
parity: Char ;
databit: integer ;
stopbit: integer
);stdcall;external 'YuComm.dll' ;
//获取重量字符串
function GetWeight( buff : pchar ;index : integer = 1 ): PChar ;stdcall;
external 'YuComm.dll' ;
//写串口
procedure WritePort( buff : array of byte ;index : integer = 0 );stdcall;
external 'YuComm.dll' ;
function ClosePort(index : integer = 1 ): integer ;stdcall;external 'YuComm.dll' ;
//name 'ClosePort1';
//辅助函数
//缓取缓冲区数据量
function GetBuffLength(index : integer = 0 ): integer ;stdcall;
external 'YuComm.dll' ;
//或取通信状态;true串口打开但通信中断,false通信正常
function GetStatus(index : integer = 0 ): boolean ;stdcall;external 'YuComm.dll' ;
//清除缓冲区数据
//procedure Clear(index :integer =0);stdcall;external 'YuComm.dll';
//获取原始数据
function GetSourceData( buff :pbyte;index : integer = 0 ): integer ;stdcall;
external 'YuComm.dll' ;
implementation end .
|
将上面文件保存为扩展名为pas的文件,添加到delphi7工程中.
(3)在VB6中调用DLL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
Private Declare Function CreateMeter Lib "YuComm" ( ByVal name As String , _
ByVal No As Integer , _
ByVal port As Integer , _
ByVal baud As Integer , _
ByVal parity As Integer , _
ByVal databit As Integer , _
ByVal stopbit As Integer ) As Boolean '需要添加一个返回值声明,即使不需要
Private Declare Function GetWeight Lib "YuComm" ( ByVal buff As String ,
Optional ByVal index As Integer = 1) As Long
Private Declare Function GetStatus Lib "YuComm" ( Optional ByVal index As Integer = 1)
As Integer
Private Declare Function ClosePort Lib "YuComm" ( Optional ByVal index As Integer = 1)
As Boolean
Private Sub Command1_Click()
Dim name As String
Dim port As Integer
Dim baud As Integer
name = Combo1.Text
port = CInt (Text1.Text)
baud = CInt (Text2.Text)
CreateMeter name, 1, port, baud, 110, 8, 1
End Sub
Private Sub Command2_Click()
ClosePort (1)
End Sub
Private Sub Command3_Click()
End Sub
Private Sub Timer1_Timer()
Dim re As Boolean
re = GetStatus(1)
If re = True Then
Label2.Caption = "串口打开成功"
Else
Label2.Caption = "串口打不成功"
End If
Dim buff1 As String
buff1 = Space(100)
Call GetWeight(buff1, 1)
Label1.Caption = buff1
End Sub
|
在XP平台下,用VB6调用,请用release方式编译,否则VB6会提示找不到相应的DLL文件,即所这个文件就在运行目录下
在VB中调用,声明函数时应加上返回值,即使DLL中这个函数没有返回值.返回值的类型可任意
(4)在C#中调用DLL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
public partial class Form1 : Form
{
//========================================================================
//1、创建仪表,并打开仪
[DllImport( "YuComm.dll" )]
public static extern bool CreateMeter( string xktype, int no, int comm,
int baud, int parity, int databit, int stopbit);
//2、读取仪表重量,多台仪表时,参数为索引
[DllImport( "YuComm.dll" )]
public static extern string GetWeight(StringBuilder weight, int index = 1);
//写串口
[DllImport( "YuComm.dll" )]
public static extern void Write( ref byte buff, int index = 1);
//3、关闭串口
[DllImport( "YuComm.dll" )]
public static extern void ClosePort( int index=1);
//ScaleWeight辅助功能函数:获取缓冲区数据个数
[DllImport( "YuComm.dll" )]
public static extern int GetBuffLength( int index = 1);
//获取通信状态:false通信正常 ,true通信中断
[DllImport( "YuComm.dll" )]
public static extern bool GetStatus( int index=1);
//辅助功能函数:读取原始数据流
[DllImport( "YuComm.dll" )]
public static extern int GetSourceData( ref byte buff, int index = 1);
//辅助功能函数:清除缓冲区
//[DllImport("YuComm.dll")]
//public static extern void Clear(int index=1);
//===================================================================
public Form1()
{
InitializeComponent();
}
private void button1_Click( object sender, EventArgs e)
{
xktype = comboBox1.Text;
szComm = textBox1.Text;
szBaud = textBox2.Text;
bool re = CreateMeter(xktype, 1, Convert.ToInt32(szComm),
Convert.ToInt32(szBaud), 'n' , 8, 1);
if (re)
{
label1.Text = "串口状态:打开成功" ;
}
else
{
label1.Text = "串口状态:打开不成功" ;
}
}
private void button2_Click( object sender, EventArgs e)
{
ClosePort(1);
label1.Text = "串口状态:串口关闭" ;
}
private void timer1_Tick( object sender, EventArgs e)
{
StringBuilder buff = new StringBuilder(255);
GetWeight(buff,1);
label2.Text = buff.ToString();
buff = null ; //释放
label5.Text = "缓冲区中数据量:" + GetBuffLength().ToString();
bool re = GetStatus();
if (re)
label4.Text = "通信状态:通信数据流正常" ;
else
label4.Text = "通信状态:通信数据流中断" ;
byte [] data = new byte [1024];
int c = GetSourceData( ref data[0],1);
richTextBox1.Clear();
for ( int i = 0; i < c; i++)
{
richTextBox1.Text += data[i].ToString( "X2" ) + " " ;
}
data = null ;
}
private void button3_Click( object sender, EventArgs e)
{
byte [] buff = new byte [1024];
string a = "hello" ;
BitConverter.ToString(buff);
Write( ref buff[0], 1);
buff = null ;
}
private void button4_Click( object sender, EventArgs e)
{
timer1.Enabled = !timer1.Enabled;
if (timer1.Enabled)
button4.Text = "暂停" ;
else
button4.Text = "开始" ;
}
}
|
在XP上运行,请使用release方式编译发布,否则调用DLL中的函数时会报错!
本文转自Chinayu201451CTO博客,原文链接:http://blog.51cto.com/9233403/2063081 ,如需转载请自行联系原作者