用VB如何做DLL接口

kimpkswm 2010-03-11 04:27:01
有一个数据表,如何编制一个DLL接口文件,以便其他程序通过该接口文件来访问该数据表?
请大家给个思路和方法,有示例程序就更感谢!

比如有一数据表ProRate,其结构为:
供应商编码 供应商名称 物料编码 物料名称 单价
001 西门子 12301001 变频器 1000
002 特锐特 12301002 变频器 800


为了控制其他程序访问这个数据表,是需通过一个接口来(受控)访问的,即只有通过DLL接口文件才能获得记录集。
这个记录集如"Select 供应商编码,物料编码,单价 From ProRate Where......"返回的结果一样.
...全文
541 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
mick55 2011-02-28
  • 打赏
  • 举报
回复
能够直接调用用吗?使用new 一个对象 觉得麻烦。
chengwei_1983 2010-11-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 tiger_zhao 的回复:]
传部分 SQL 还是不能避免 SQL 注入。
[/Quote]

发现高手,顺便请教一下,我写了一个貌似1楼说的API式的DLL,在调试的时候都没有问题,但是调用的时候却出问题了~~,简单描述如下:

Function AAA(Byval strA as String,Byref strB as String) as Integer
Dim Tempstr as String
Tempstr=Left(strA,2)
strB=Tempstr
End Function
调用时

Private Declare Function AAA Lib "aaa.dll" (Byval strA as String,Byref strB as String) as Integer

s="12345678"
i=AAA(s,t)
MsgBox t
这时候显示为1234
如果我定义的时候修改为:Dim Tempstr as String*1
就可以显示为12
难道是和数据类型有关?但是如果我只想显示1呢?该怎么办??
这个可能是和数据类型有关,高手能为我解释一下吗?非常感谢~~!

嗷嗷叫的老马 2010-06-21
  • 打赏
  • 举报
回复
同上...
guyehanxinlei 2010-06-21
  • 打赏
  • 举报
回复
路过学习一下
Tiger_Zhao 2010-06-21
  • 打赏
  • 举报
回复
1)CProRate 有属性 {供应商编码,物料编码,单价}
2)CProRateCollection 集合类没什么好说的。
3)CProRateControler Query():
取得的记录集有多少条记录,就创建相同数量的 CProRate 实例;
并且把字段值赋值为对象的属性;
新建一个 CProRateCollection 实例,将所有的 CProRate 实例添加到这个集合中,该集合作为返回值。

调用者只能访问 CProRateCollection 和 CProRate 实例,不能访问记录集,也就无法取得数据库信息。
咸清 2010-06-21
  • 打赏
  • 举报
回复
还是 MSDN 的例子比较清楚!
kimpkswm 2010-06-19
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 tiger_zhao 的回复:]
“安全”的封装需要有3个类来对应 ProRate 表:
1) CProRate - 数据类,对应 ProRate 的一条记录,成员就是字段
2) CProRateCollection - 集合类,对应一个 ProRate 的记录集。
3) CProRateControler - 控制类,提供各种访问功能。比如 Query() 方法就是执行查询,然后将记录集转化为 CProRateCollec……
[/Quote]

大虾能否详细一些:),即是实现贴子提到的功能,又能避免将访问数据库的信息全暴露给调用用户?
Tiger_Zhao 2010-06-14
  • 打赏
  • 举报
回复
“安全”的封装需要有3个类来对应 ProRate 表:
1) CProRate - 数据类,对应 ProRate 的一条记录,成员就是字段
2) CProRateCollection - 集合类,对应一个 ProRate 的记录集。
3) CProRateControler - 控制类,提供各种访问功能。比如 Query() 方法就是执行查询,然后将记录集转化为 CProRateCollection 集合进行返回。
kimpkswm 2010-06-14
  • 打赏
  • 举报
回复
顶一下,请大虾看第15贴提出的问题。
kimpkswm 2010-05-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tiger_zhao 的回复:]
1)新建工程,类型为 ActiveX Dll。
2)添加引用 Microsoft ActiveX Data Objects 2.x Library
3)在默认的 Class1 中添加代码:

VB code
Option Explicit

Public Function GetData() As Recordset
Dim cn As ADODB.Connection
……
[/Quote]

Private Sub TRVmaindata_Click()
Dim TestDll As IncSl.UtoS
Set TestDll = New IncSl.UtoS

Set Adodc_Test.Recordset = TestDll.GetData
Debug.Print Adodc_Test.RecordSource
Debug.Print Adodc_Test.ConnectionString
这样两条语句就可以将访问数据库的信息全暴露了,怎么样才能避免?
End Sub
king06 2010-03-12
  • 打赏
  • 举报
回复
dll返回某个固定的东西才有限制作用,不过用到各台客户端就不方便了.
一般用xml来做接口
无·法 2010-03-12
  • 打赏
  • 举报
回复
效率估计要低点了吧
Tiger_Zhao 2010-03-12
  • 打赏
  • 举报
回复
传部分 SQL 还是不能避免 SQL 注入。
bcrun 2010-03-12
  • 打赏
  • 举报
回复
那这样

'---------------------------------------------------------------------------------------
' 过程名 : GetData
' 时间 : 2010-3-11 22:56
' 作者 : 杨过.网狐.cn
' 功能 :http://topic.csdn.net/u/20100311/16/a335911d-50bc-4831-9059-f49a1f176cb0.html
' 说明 :用VB如何做DLL接口
'---------------------------------------------------------------------------------------
'
Public Function GetData() As ADODB.Recordset
Set GetData = GetProRateData("供应商编码,物料编码,单价")
End Function

'---------------------------------------------------------------------------------------
' 过程名 : GetProRateData
' 时间 : 2010-3-12 09:05
' 作者 : 杨过.网狐.cn
' 功能 :
' 说明 : strFieldClause为SELECT子句,便于对于不同的接口方法需求输出不同的字段
'---------------------------------------------------------------------------------------
'
Private Function GetProRateData(strFieldClause As String) As ADODB.Recordset
Dim cn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim strConnection As String, strSql As String

Set cn = New ADODB.Connection
strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & str_MdbFile & _
";Persist Security Info=False"
cn.Open strConnection
Set rst = New ADODB.Recordset
strSql = "select " & strFieldClause & " from ProRate"
rst.Open strSql, cn, adOpenDynamic, adLockReadOnly '如允许修改则选其它的如adLockOptimistic
Set GetProRateData = rst
End Function

Tiger_Zhao 2010-03-12
  • 打赏
  • 举报
回复
直接传 sql 就失去封装的意义了,既然可用直接操作数据库,那么直接用 ADO 就行了。
用数据对象封装的目的就是限定数据操作来提高数据安全性,避免未经允许的数据操作。
bcrun 2010-03-11
  • 打赏
  • 举报
回复
我也来写几句:

'
'---------------------------------------------------------------------------------------
' 过程名 : GetData
' 时间 : 2010-3-11 22:56
' 作者 : 杨过.网狐.cn
' 功能 :http://topic.csdn.net/u/20100311/16/a335911d-50bc-4831-9059-f49a1f176cb0.html
' 说明 :用VB如何做DLL接口
'---------------------------------------------------------------------------------------
'
Public Function GetData(strSql As String) As ADODB.Recordset
Dim cn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim str_Connection As String

Set cn = New ADODB.Connection
str_Connection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & str_MdbFile & _
";Persist Security Info=False"
cn.Open str_Connection
Set rst = New ADODB.Recordset

rst.Open strSql, cn, adOpenDynamic, adLockReadOnly '如允许修改则选其它的如adLockOptimistic
Set GetData = rst
End Function
东方之珠 2010-03-11
  • 打赏
  • 举报
回复
先看一下MSDN的这个例子,有了一定的认识后再亲手做:

创建 ThingDemo DLL 工程


用 Visual Basic 创建一个 ActiveX DLL 是非常容易的,只要声明变量和编写过程就可以创建一个进程内部件。

本节提供了有关如何定义简单的类的循序渐进的指南,同时说明了由部件提供的对象的存活期。用这样的类创建的对象可以用于任何应用程序,只要应用程序能够使用 Automation 控制对象。

注意 创建一个 ActiveX DLL 示例需要分为几步,这个帮助主题只是其中一步。要访问该帮助主题,在“相关信息”中选择帮助主题“创建 ActiveX DLL”即可。

要创建 ThingDemo 工程,请按照以下步骤执行:

在“文件”菜单中,单击“新建工程”。


在“新建工程”对话框中,双击“ActiveX DLL”图标。Visual Basic 将向该新工程中自动添加一个类模块 Class1。


按 F4 键打开“属性”窗口。双击“名称”属性并把它改成 Thing。通过类创建对象时需要使用这个名称。
Instancing 属性的缺省值是 MultiUse。这允许客户应用程序创建 Thing 类的多个实例。关于 Instancing 属性的详细讨论,请参阅“部件设计的一般准则”中的“ActiveX 部件提供的类的实例化”。

在“工程”菜单中,单击“Project1 属性”打开“工程属性”对话框。选择“通用”选项卡,填写以下信息,然后单击“确定”。



ThingDemo 是工程名,同时用作部件的类型库的名称。它与部件提供的每个类的名称结合起来即可产生唯一的类名。

如果两个部件各自提供了一个 Thing 类,那么需要对类名进行完全的限定,以区分到底要使用哪一个部件的 Thing 类,例如 ThingDemo.Thing。

在“工程”菜单中,单击“添加模块”打开“添加模块”对话框。双击“模块”图标向工程中添加一个模块。
注意 如果已经使用了“选项”对话框(可以由“工具”菜单打开)禁止“添加模块”对话框,那么就只能读取已有的模块。

在模块的代码窗口中,添加下列代码:
Option Explicit
Public gdatServerStarted As Date

Sub Main()
'部件开始时要执行的代码,
' 对第一个对象的请求作出反应。
gdatServerStarted = Now
Debug.Print "E xecuting Sub Main"
End Sub

'为对象提供唯一标识符的函数。
Public Function GetDebugID() As Long
Static lngDebugID As Long
lngDebugID = lngDebugID + 1
GetDebugID = lngDebugID
End Function

在“文件”菜单中,单击“保存工程”,使用下面的名称保存工程文件。Visual Basic 会自动提供扩展名。 文件 文件名 扩展名
模块 ThingDemo_Module1 .bas
类模块 ThingDemo_Thing .cls
工程 ThingDemo .vbp


详细信息 请参阅“部件设计的一般准则”中的“选择工程类型和设置工程属性”。

循序渐进
创建 ActiveX DLL 示例需要好几步,该帮助主题只是其中一步。

目的 请参阅
到下一步 为 Thing 类创建属性和方法Class
从头开始 创建一个 ActiveX DLL

gukuang78 2010-03-11
  • 打赏
  • 举报
回复
直接做个类,把这些全封装里面,以后用的时候好用。
孤独剑_LPZ 2010-03-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tiger_zhao 的回复:]
1)新建工程,类型为 ActiveX Dll。
2)添加引用 Microsoft ActiveX Data Objects 2.x Library
3)在默认的 Class1 中添加代码:
VB codeOptionExplicitPublicFunction GetData()As RecordsetDim cnAs ADODB.ConnectionSet cn=New ADODB.Connection
cn.Open"..."Set GetData= cn.Execute("Select 供应商编码,物料编码,单价 From ProRate Where......")End Function
[/Quote]

改进一下模块,更灵活

Option Explicit

Public Function GetData(sql as string) As Recordset
Dim cn As ADODB.Connection

Set cn = New ADODB.Connection
cn.Open "..."

Set GetData = cn.Execute(sql)
End Function


程序调用时
sSql= "Select 供应商编码,物料编码,单价 From ProRate Where......"
rs= 类名.GetData(sSql as string)
贝隆 2010-03-11
  • 打赏
  • 举报
回复
按照向导来制作即可,3楼详细
加载更多回复(4)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧