VB中调用Class(类模块)及调用DLL(动态链接库)问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VB中调用Class(类模块)及调用DLL(动态链接库)问题相关的知识,希望对你有一定的参考价值。

本人不才,有望指教。
问题一:例如我新建一个工程,工程中有一个标准窗口和一个类模块(Class1)。我在类模块中已写入以下函数:
Public Add Function (A As Double, B As Double) As Double
Add = A + B
End Function
请问我如何在标准窗口中调用该类模块(Class1)中的Add函数?

问题二:例如我用类模块(Class1)编写如下函数:
Public Add Function (A As Double, B As Double) As Double
Add = A + B
End Function
并生成dll文件,命名为“AF.dll”。
我再重新找开一个VB新建标准工作,内有一个标准窗口,请问我如何调用我刚才生成的AF.dll内的Add函数?我己尝试用类似于调用API函数的方法来调用它,可是提示“找不到接入口”。

请有好心人帮忙解决下这两个问题。
哦,是的,函数写错了,是我直接打上问题的,不是在VB写好复制上来的,所以打错了,这点我知道。
Public Function Add (A As Double, B As Double) As Double
Add = A + B
End Function

最好把这个例写编写好把然后打包好发送到我的邮箱:172693620@qq.com 并注明你的百度名称,能使用的我就选他为最佳答案。

我具体是这么做的:先新建一个activex.dll工程,我是做实验的,里面只有一个函数public
function
go()
as
string
go
=
"sdf"end
function在delphi中如何调用?
参考技术A 邮件已发,请查收
======================================

函数写错了吧。应该是

Public Function Add (A As Double, B As Double) As Double
Add = A + B
End Function

问题一:

在form1窗体中,调用类class1中的add函数
Private Sub Command1_Click()
Dim n1 As Double
Dim n2 As Double
n1 = 3
n2 = 4
Dim c1 As New Class1
MsgBox c1.Add(n1, n2)

Set c1 = Nothing
End Sub

问题二:vb生成的dll是activex dll,要使用前,先要注册,注册方法
regsvr32 AF.DLL

记得要写上路径,比如AF.DLL放在c盘的根目录下,就在开始菜单的运行中输入 regsvr32 c:\AF.dll

注册后,就可以在窗体中,调用 它了。

Private Sub Command1_Click()
Dim n1 As Double
Dim n2 As Double

n1 = 4
n2 = 6

Dim c1 As Object
Set c1 = CreateObject("Project1.Class1")
MsgBox c1.Add(n1, n2)

Set c1 = Nothing
End Sub本回答被提问者采纳

C#中如何调用动态链接库DLL

每种编程语言调用DLL的方法都不尽相同,在此只对用C#调用DLL的方法进行介绍。首先,您需要了解什么是托管,什么是非托管。一般可以认为:非托管代码主要是基于win 32平台开发的DLL,activeX的组件,托管代码是基于.net平台开发的。如果您想深入了解托管与非托管的关系与区别,及它们的运行机制,请您自行查找资料,本文件在此不作讨论。(一) 调用DLL中的非托管函数一般方法首先,应该在C#语言源程序中声明外部方法,其基本形式是:[DLLImport(“DLL文件”)]修饰符 extern 返回变量类型 方法名称 (参数列表)其中:DLL文件:包含定义外部方法的库文件。修饰符: 访问修饰符,除了abstract以外在声明方法时可以使用的修饰符。返回变量类型:在DLL文件中你需调用方法的返回变量类型。方法名称:在DLL文件中你需调用方法的名称。参数列表:在DLL文件中你需调用方法的列表。注意:需要在程序声明中使用System.Runtime.InteropServices命名空间。 DllImport只能放置在方法声明上。DLL文件必须位于程序当前目录或系统定义的查询路径中(即:系统环境变量中Path所设置的路径)。返回变量类型、方法名称、参数列表一定要与DLL文件中的定义相一致。 若要使用其它函数名,可以使用EntryPoint属性设置,如:[DllImport("user32.dll", EntryPoint="MessageBoxA")]static extern int MsgBox(int hWnd, string msg, string caption, int type);其它可选的 DllImportAttribute 属性:CharSet 指示用在入口点中的字符集,如:CharSet=CharSet.Ansi;SetLastError 指示方法是否保留 Win32"上一错误",如:SetLastError=true;ExactSpelling 指示 EntryPoint 是否必须与指示的入口点的拼写完全匹配,如:ExactSpelling=false;PreserveSig指示方法的签名应当被保留还是被转换, 如:PreserveSig=true;CallingConvention指示入口点的调用约定, 如:CallingConvention=CallingConvention.Winapi; 此外,关于“数据封送处理”及“封送数字和逻辑标量”请参阅其它一些文章[2]。C#例子:1. 启动VS.NET,新建一个项目,项目名称为“Tzb”,模板为“Windows 应用程序”。2. 在“工具箱”的“ Windows 窗体”项中双击“Button”项,向“Form1”窗体中添加一个按钮。3. 改变按钮的属性:Name为 “B1”,Text为 “用DllImport调用DLL弹出提示框”,并将按钮B1调整到适当大小,移到适当位置。4. 在类视图中双击“Form1”,打开“Form1.cs”代码视图,在“namespace Tzb”上面输入“using System.Runtime.InteropServices;”,以导入该命名空间。5. 在“Form1.cs[设计]”视图中双击按钮B1,在“B1_Click”方法上面使用关键字 static 和 extern 声明方法“MsgBox”,将 DllImport 属性附加到该方法,这里我们要使用的是“user32.dll”中的“MessageBoxA”函数,具体代码如下:[DllImport("user32.dll", EntryPoint="MessageBoxA")]static extern int MsgBox(int hWnd, string msg, string caption, int type);然后在“B1_Click”方法体内添加如下代码,以调用方法“MsgBox”:MsgBox(0," 这就是用 DllImport 调用 DLL 弹出的提示框哦! "," 挑战杯 ",0x30); 6. 按“F5”运行该程序,并点击按钮B1,便弹出如下提示框: (二) 动态装载、调用DLL中的非托管函数在上面已经说明了如何用DllImport调用DLL中的非托管函数,但是这个是全局的函数,假若DLL中的非托管函数有一个静态变量S,每次调用这个函数的时候,静态变量S就自动加1。结果,当需要重新计数时,就不能得出想要的结果。下面将用例子说明:1. DLL的创建1) 启动Visual C++ 6.0;2) 新建一个“Win32 Dynamic-Link Library”工程,工程名称为“Count”;3) 在“Dll kind”选择界面中选择“A simple dll project”;4) 打开Count.cpp,添加如下代码:// 导出函数,使用“ _stdcall ” 标准调用extern "C" _declspec(dllexport)int _stdcall count(int init);int _stdcall count(int init)//count 函数,使用参数 init 初始化静态的整形变量 S ,并使 S 自加 1 后返回该值static int S=init;S++;return S;5) 按“F7”进行编译,得到Count.dll(在工程目录下的Debug文件夹中)。 2. 用DllImport调用DLL中的count函数1) 打开项目“Tzb”,向“Form1”窗体中添加一个按钮。2) 改变按钮的属性:Name为 “B2”,Text为 “用DllImport调用DLL中count函数”,并将按钮B1调整到适当大小,移到适当位置。3) 打开“Form1.cs”代码视图,使用关键字 static 和 extern 声明方法“count”,并使其具有来自 Count.dll 的导出函数count的实现,代码如下:[DllImport("Count.dll")]static extern int count(int init);4) 在“Form1.cs[设计]”视图中双击按钮B2,在“B2_Click”方法体内添加如下代码:MessageBox.Show(" 用 DllImport 调用 DLL 中的 count 函数, n 传入的实参为 0 ,得到的结果是: "+count(0).ToString()," 挑战杯 ");MessageBox.Show(" 用 DllImport 调用 DLL 中的 count 函数, n 传入的实参为 10 ,得到的结果是: "+count(10).ToString()+"n 结果可不是想要的 11 哦!!! "," 挑战杯 ");MessageBox.Show(" 所得结果表明: n 用 DllImport 调用 DLL 中的非托管 n 函数是全局的、静态的函数!!! "," 挑战杯 "); 5) 把Count.dll复制到项目“Tzb”的binDebug文件夹中,按“F5”运行该程序,并点击按钮B2,便弹出如下三个提示框: 第1个提示框显示的是调用“count(0)”的结果,第2个提示框显示的是调用“count(10)”的结果,由所得结果可以证明“用DllImport调用DLL中的非托管函数是全局的、静态的函数”。所以,有时候并不能达到我们目的,因此我们需要使用下面所介绍的方法:C#动态调用DLL中的函数。 参考技术A 一、创建dll文件:
例如生成一个md5编码判断状态的文件,即,输入一个字符串(string A)和一个32位md5编码(string B),判断此字符串A对应的32位md5编码是否与B相等,如果相等返回true,否则返回false。
打开VS 2005,“文件”--》“新建”--“项目”,选择“Windows 控件库”,命名后点击“确定”,在“UserControl1.cs”中输入以下代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;

using System.Text;
using System.Security.Cryptography;

namespace md5

public partial class Program : UserControl

#region MD5 32位加密:GetMd5Str32
/// <summary>
/// 32位MD5加密
/// </summary>
/// <param name="strSource">待加密字串</param>
/// <returns>加密后的字串</returns>
public static string GetMd5Str32(string strSource)

byte[] bytes = Encoding.ASCII.GetBytes(strSource);
byte[] hashValue = ((System.Security.Cryptography.HashAlgorithm)System.Security.Cryptography.CryptoConfig.CreateFromName("MD5")).ComputeHash(bytes);
StringBuilder sb = new StringBuilder();

for (int i = 0; i < 16; i++)

sb.Append(hashValue[i].ToString("x2"));


return sb.ToString().ToUpper();

#endregion

#region 核对md5编码是否一致:CheckMd5String()

/// <summary>
/// 核对md5编码是否一致
/// </summary>
/// <param name="ConvertString"></param>
/// <returns>如果一致返回true,否则返回false</returns>
///
public static bool CheckMd5String(string str1, string str2)

string md5String = str1; //需要验证的字符串
string md5DbString = str2; //需要核对的32位md5编码

int result = string.Compare(md5.Program.GetMd5Str32(str1), md5DbString, true);
if (result == 0)

return true;

else

return false;


#endregion


修改“UserControl1.Designer.cs”中的命名空间为“md5”,方法为“Program”,即可生成dll文件。
在...\bin\Debug文件假下,可以找到相应的dll文件。
二、部署dll流程:
首先把dll文件放到应用程序...\bin\Debug\下;然后在解决方案中添加引用:右键鼠标-->添加引用-->浏览-->选择dll放置路径后点击“确定”。
注意:要在应用文件头处使用using md5;命令。测试应用程序代码,如下:Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using md5;

namespace WindowsApplication1

public partial class Form1 : Form

public Form1()

InitializeComponent();


private void button1_Click(object sender, EventArgs e)

string str1 = textBox1.Text.ToString();
string md5String = textBox2.Text.ToString();

textBox3.Text = md5.Program.GetMd5Str32(str1);
textBox4.Text = md5.Program.CheckMd5String(str1, md5String).ToString();



private void button2_Click(object sender, EventArgs e)

this.Close();


以上是关于VB中调用Class(类模块)及调用DLL(动态链接库)问题的主要内容,如果未能解决你的问题,请参考以下文章

VB怎样调用DLL中的资源

vb.net如何动态调用WebService接口啊

vb.net如何调用dll(动态链接库)

用C语言如何写DLL动态链接库?VB.net 又如何调用其生成的DLL库?急急急!!!!在线等!!

vb.net引用Dll的问题

C#怎么调用C++的dll?