VB编写标准DLL返回字符串,供DELPHI调用报错

Jacky8716 2016-10-25 09:43:49
求助各位大神,有个delphi7写的标准DLL,我需要用VB6实现,形式如下
//虚假实现
function WriteCard(StrCardNo: Pchar): Integer; stdcall;
begin
Result := 0;
end;

//虚假实现
function ReadCard(StrCardNo: Pchar): Integer; stdcall;
begin
StrPCopy(StrCardNo, '12345678');
Result := 0;
end;

因为要采用标准DLL,非ActiveX dll,从网上找了相关方法,我的测试方法如下:
1。ThirdPartWriteReadCard.dll这个是要实现的DLL,厂家给出DELPHI源码,即编译后的DLL
2。ClientPrj.exe厂家贴心给出了测试DEMO,用来测试调用DLL,显示返回值

3。我在VB里做了DEMO实现,如下,一切正常
Option Explicit

Private Declare Function WriteCard Lib "ThirdPartWriteReadCard.dll" (ByVal StrCardNo As String) As Long
Private Declare Function ReadCard Lib "ThirdPartWriteReadCard.dll" (ByVal StrCardNo As String) As Long

Private Sub Command1_Click()
On Error GoTo err
Dim StrCardNo As String
StrCardNo = Space$(255)


If ReadCard(StrCardNo) <> 0 Then MsgBox "error"
' strCardNo = StringFromPtr(StrPtr(strCardNo))

MsgBox "卡号:" + StrCardNo + "。"
Exit Sub
err:
MsgBox err.Description
End Sub

4。开始写VB版DLL,并编译为标准DLL,非COM
Public Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, ByVal Source As Any, ByVal Length As Long)

' - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Private Sub Main(): End Sub '请不要修改或删除这一行!!!
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
'在这后面写上你的其它 Sub/Function ,或者全部写到其它模块中

'//虚假实现
Public Function ReadCard(ByVal lpCardNo As Long) As Long

ReadCard = 0
Dim curCardNo As String
curCardNo = "bb22303**230304"

CopyMemory ByVal lpCardNo, ByVal curCardNo, LenB(curCardNo)
'====上面代码VB DEMO可以获取字符串,delphi报 vbmsvm60.dll内存写错误
End Function
...全文
876 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jacky8716 2016-11-11
  • 打赏
  • 举报
回复
给分了,最后是用DELPHI做了这个DLL,然后DLL里去调用VB标准ActiveXDLL。绕一下路,问题解决了, 感谢 Chen8013 没有说完,TLB那个我 就用了 ”则只用到StrPtr(VB6的)和另外两个API:lstrlen(W版)CopyMemory 。“ 确实报错。时间紧就没深究,没有特殊代码,后面有时间我会再研究一下,但总感觉这么做不稳定。 还有奉劝一下其他的同学,这么写代码是有原因的,看问题不要太片面,DELPHI已经是没落产品了,我从心里就不愿意去搞这个对接,如果再让我去研究怎么用DELPHI实现IC 卡读写,还有后面的加解密,进制换算更麻烦,所以我不可能用DELPHI实现。 有时间我宁愿去研究JAVA .NET JS 都比DELPHI强,可能DELPHI同学看到不舒服,但这是事实!没办法
Jacky8716 2016-11-11
  • 打赏
  • 举报
回复
给分了,最后是用DELPHI做了这个DLL,然后DLL里去调用VB标准ActiveXDLL。绕一下路,问题解决了, 感谢 Chen8013
舉杯邀明月 2016-10-28
  • 打赏
  • 举报
回复
楼主还应该注意一个问题: 用我的工具制作“标准DLL”,注意看看“工程属性”的“编译”选项卡, 一定要选“编译为本机代码”(VB6默认是这个),但是确认一下最好, 以防止编译选项有误(如果你没有人为的改动过.vbp文件,或去选择了“P代码”,就不会错)。 如果没有遇到某些特殊原因必须编译为P代码的(反正我是没遇到过),   最好就要按“本机代码”方式进行编译。 还有,估计编译为P代码之后,也无法给其它环境调用了(我没测试过,只是猜测),只能给VB6程序用。
舉杯邀明月 2016-10-28
  • 打赏
  • 举报
回复
引用 13 楼 of123 的回复:
VB 不支持直接编译为标准 DLL。如果 Delphi 不熟,可以用 VC++,很容易。
有我那个工具,即可“直接编译为标准 DLL”。
舉杯邀明月 2016-10-28
  • 打赏
  • 举报
回复
引用 12 楼 nmgzjf 的回复:
[quote=引用 11 楼 Chen8013 的回复:] [quote=引用 8 楼 xiaoyao961 的回复:] 脑子 非常有问题,本身就是标准DLL了,直接给DELPHI用就行了,多此一举还要用VB再写一个DLL
也许厂家提供的DLL及源码,只是一种“样本”而已, 实际应用中,有可能是针对自己的硬件特征(或者因为有某些“特殊要求”)自己写实现接口。 看了楼主的主贴内容,我可以肯定他就是下载的我的那个DLL工具。 [/quote] 先要感谢一下做的贡献,但很遗憾,引用WIN32api.tlb,仍然报错,提示是找到函数的入口点。已经换了办法实现了 另外,我81年的,2000断断续续写代码,虽然不算高手,但也绝不算新手了,实在是解决不了了[/quote] 如果“找到入口点”哪会有错,是提示“找不到函数入口点”吧? 你说说是哪个API函数提示出错,我好看看她那个TLB的信息是否有误。 只是“实现”你主贴最后那一小段测试代码,都会提示出错? 那一小段代码, 如果返回ANSI编码字符串,用到的API有内存申请及释放、编码转换、内存复制这几个相关API, 如果返回Unicode字符串,则只用到StrPtr(VB6的)和另外两个API:lstrlen(W版)CopyMemory 。 一般来说是不会出现任何问题的。 我估计还是你的DLL代码写得不正确,不妨把代码贴出来,我看看问题在哪。 (如果是你的“完整实现”提示出错、不方便透露代码,那就算了)
of123 2016-10-28
  • 打赏
  • 举报
回复
VB 不支持直接编译为标准 DLL。如果 Delphi 不熟,可以用 VC++,很容易。
of123 2016-10-28
  • 打赏
  • 举报
回复
楼主已经说“供DELPHI调用”。 就如同多线程、非 __stdcall 调用等问题,用一些招数可能绕过去,但仍有许多限制。
Jacky8716 2016-10-27
  • 打赏
  • 举报
回复
引用 11 楼 Chen8013 的回复:
[quote=引用 8 楼 xiaoyao961 的回复:] 脑子 非常有问题,本身就是标准DLL了,直接给DELPHI用就行了,多此一举还要用VB再写一个DLL
也许厂家提供的DLL及源码,只是一种“样本”而已, 实际应用中,有可能是针对自己的硬件特征(或者因为有某些“特殊要求”)自己写实现接口。 看了楼主的主贴内容,我可以肯定他就是下载的我的那个DLL工具。 [/quote] 先要感谢一下做的贡献,但很遗憾,引用WIN32api.tlb,仍然报错,提示是找到函数的入口点。已经换了办法实现了 另外,我81年的,2000断断续续写代码,虽然不算高手,但也绝不算新手了,实在是解决不了了
Jacky8716 2016-10-26
  • 打赏
  • 举报
回复
我先试试TLB方案:)
Jacky8716 2016-10-26
  • 打赏
  • 举报
回复
难怪我的代码连outputdebugstring这样的API都用不了,全部报错啊, 您 说的 “高级技术手段”要怎么搞呢?
舉杯邀明月 2016-10-26
  • 打赏
  • 举报
回复
引用 8 楼 xiaoyao961 的回复:
脑子 非常有问题,本身就是标准DLL了,直接给DELPHI用就行了,多此一举还要用VB再写一个DLL
也许厂家提供的DLL及源码,只是一种“样本”而已, 实际应用中,有可能是针对自己的硬件特征(或者因为有某些“特殊要求”)自己写实现接口。 看了楼主的主贴内容,我可以肯定他就是下载的我的那个DLL工具。
  • 打赏
  • 举报
回复
QQ2776478814,具体是啥用途呀,可以试试
  • 打赏
  • 举报
回复
我是看不懂为什么要这么写,虚假卡号?
  • 打赏
  • 举报
回复
脑子 非常有问题,本身就是标准DLL了,直接给DELPHI用就行了,多此一举还要用VB再写一个DLL
舉杯邀明月 2016-10-25
  • 打赏
  • 举报
回复
如果你自己不会制作tlb ,百度贴吧有人做了一个现成的: http://tieba.baidu.com/p/4675878564 这个TLB基本上把VB6的“API函数浏览器”中的所有函数声明、类型定义、常量定义包含完了。 资源下载地址: http://pan.baidu.com/s/1sl4A2ZF 用“TLB”处理这个“与其它语言环境兼容”只是一个常规方法。 其实也有“高级技术手段”,可以实现在VB6编写的DLL中,可以实现: 1. 直接调用Declare的API函数。 2. 可以任意创建对象(包括用 new 创建自己代码中类模块的对象)及窗体等。 3. 可以使用几乎全部的VB6内置函数。 等等…… 基本上“接近100%的常规VB6代码写法”都可以在DLL代码中直接使用。
舉杯邀明月 2016-10-25
  • 打赏
  • 举报
回复


API函数 不能用Declare方式声明来调用,必须采用 TLB  !!!


Jacky8716 2016-10-25
  • 打赏
  • 举报
回复
好吧,这样还需要厂家改调用代码。我是想法是不用厂家改任何东西,看来不行了。
赵4老师 2016-10-25
  • 打赏
  • 举报
回复
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢? 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话,文本文件的格式问题可参考json或xml 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·…… “跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边, 回头是“使用共享纯文本文件进行信息交流”的岸!

1,486

社区成员

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

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