VC2015编写的DLL给其他语言调用

简介:

(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 ,如需转载请自行联系原作者



相关文章
|
7月前
MFC编写DLL窗口功能代码
MFC编写DLL窗口功能代码
34 0
|
C#
C#调用dll代码范例
C#调用dll代码范例
120 0
C++ 编写DLL文件给易语言调用
  摸索了两天了,终于解决了所有问题,在此跟大家分享。   需要三个文件,dll_demo.h、dll_demo.cpp、dll_dome.def   直接上代码:   头文件如下: 1 #ifndef _DLL_DEMO_H_ 2 #define _DLL_DEMO_H_ 3 #ifdef DL...
2180 0
|
网络协议 C# C++
VS2017编写MFC库以及使用Qt调用MFC库方法
VS2017编写MFC库以及使用Qt调用MFC库方法
VS2017编写MFC库以及使用Qt调用MFC库方法
|
C# 图形学 C++
Unity与 DLL文件 ☀️| 怎样使用 C# 类库 生成一个DLL文件 并 调用!
📢前言 🎬生成DLL文件 🎥使用 C#类库 将Unity中的脚本打包成 DLL文件 并调用 🏳️‍🌈第一步:打开Visual Studio之后,新建一个项目 🏳️‍🌈第二步:选择类库(.NET Framework),改个名字,选择一个位置路径 🏳️‍🌈第三步:然后在创建的脚本中简单写一点代码,如下所示 🏳️‍🌈第四步:然后在解决方案资源管理器右键这个脚本 -> 添加 -> 引用 🏳️‍🌈第五步:然后点击浏览,找到Unity安装路径 -> Editor -> Data -> Managed 下的这两个DLL 文件,点击添加!
Unity与 DLL文件 ☀️| 怎样使用 C# 类库 生成一个DLL文件 并 调用!