Dephi声明如何转VB声明

zbl5174 2009-09-11 04:39:23
小弟最近给医保做接口,对方提代的DLL是用好像是用Dephi写的,并且提供了Dephi的声明
对方的dephi声明
function checkuser(OperID: PChar; var returnMessage: pchar):Integer;stdcall; external 'zdtlmti.dll';

我写的VB声明
Public Declare Function checkuser Lib "zdtlmti.dll" (ByVal OperID As String, ByVal returnMessage As String) As Long

在VB调试环境调用的时候,系统马上崩溃,出现"应用程序发生异常 未知的软件异常 (OxOeedfade),位置为 Ox7c812afb.",确定之后立即就退出了;但是在编译之后调用就没有错误.
我看Dephi帮助说pchar是指针,小弟一看是指针就蒙,哪位同行有相关的经验,分享一下吧,我先致以最真诚的感谢
...全文
172 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
嗷嗷叫的老马 2009-09-19
  • 打赏
  • 举报
回复
哈,帮顶.
zbl5174 2009-09-19
  • 打赏
  • 举报
回复
终于弄明白是怎么回事了,原来的Dll调用初始化文件.ini找不到,这个.ini得放到和编译器vb6.exe同一个目录下才好使,放在工程文件下就找不到;其实这个问题前几天就就应该找到,不知大家有没有下载我发的[Dll测试.rar],里面的测试说明中的第5句:
[5.修改了ClientConfig.ini中的[DB]下的配置,使其故意不对,然后运行编译后的[Dll测试.exe],错误和3一样,是不是说明在VB调试环境下Dll没有读取到ClientConfig.ini的内容?],
其实真就是VB调试环境下Dll没有读取到ClientConfig.ini的内容,就是因为一调试就崩溃,没有任何有用的提示,所以一直没想到;
根本没有大家说的指什之类的问题,怎么测试都好使,17楼的方法试了也好使,看来VB没有那脆弱,
1.声明时参数为string,直接传入str即可,
2.声明时参数为long,传入StrPtr(str)也行
我相信大家遇到的VB调试dll时崩溃的问题,如果dll本身需要初始化,大多是这个dll找不到外部文件导致.
特别感谢这些天各楼层弟兄的顶力帮助,祝大家国庆快乐!
zbl5174 2009-09-15
  • 打赏
  • 举报
回复
这个DLL运行是需要sql server2000数据库,有两个表需要通过执行[interface脚本.sql]生成,
然后再修改ClientConfig.ini中的[DB]下的配置
yin138 2009-09-15
  • 打赏
  • 举报
回复
function checkuser(OperID: PChar; var returnMessage: pchar):Integer
在网上找了一些有关DEPHI 的var参数的一些区别,以上各位并没有注意到这个var,也许以为变量,就是变量吧。
这个var加上参数的时候,DEPHI会做一些特殊的处理:自动转变这一参数为一个地址
按照我的理解,这个声明如果转化成VB语言的话,应该是
function checkuser(Byval OperID As String,
Byref returnMessage As String) as Integer
of123 2009-09-15
  • 打赏
  • 举报
回复
我这里测试的情况,无论是否编译后执行,都是数秒无响应,然后因错误退出。

楼主,这个 DLL 运行没有其他条件吗?比如,是否需要数据库?
slowgrace 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 soyokaze 的回复:]
支持,可以试一下。此外,注意zdtlmti这个库接受的是ANSI字符还是UNICODE字符,是前者的话,还需要在此(传字符地址)之前用StrConv()函数转换一下。
[/Quote]

赞同。
zbl5174 2009-09-14
  • 打赏
  • 举报
回复
接口商人家是写Dll的,咱这种搞应用的,人家说好使就好使呗,哪个还说个"不"字,我现在让大伙一起看看,如果解决了那就是帮了我的大忙,毕竟客户还等着交差,解决不了,那也是帮了我的忙,我就可以和人家叫板了,说他们的Dll有问题,弟兄们,给我点力量吧!
zbl5174 2009-09-14
  • 打赏
  • 举报
回复
我问接口工程师说这个zdtlmti.dll是用Dephi写的,说在dephi和pb下调用好使,但是没做过vb的调用测试
zbl5174 2009-09-14
  • 打赏
  • 举报
回复
文档中关于接口参数的说明如下
函数的调用格式为:
int 函数名(char* OperID , char* returnMessage);
operId为全球唯一不重复标识码GUID,长度为38位,格式如
{F9AEE43D-E6B6-4787-84CC-FCB92F05A9DC},由系统在调用接口函数前生成,作为本次调用接口函数的入口和出口数据唯一标识。
ReturnMessage传入时为长度不小于200的空字符组成的串,在函数执行完成后,可以通过returnMessage来获取函数中文提示信息
of123 2009-09-14
  • 打赏
  • 举报
回复

这个动态库似乎有问题。OperID 有什么约束条件吗?
of123 2009-09-14
  • 打赏
  • 举报
回复
function checkuser(OperID: PChar; var returnMessage: pchar):Integer;stdcall; external 'zdtlmti.dll';
----------------------------------------------------------------------------------
Public Declare Function checkuser Lib "zdtlmti.dll" (Byval OperID As String, Byval returnMessage As String) As Long

调用:

Dim OperID As String
Dim returnMessage As String
Dim rv As Long

OperID = "123456"

'返回值变量一点要分配空间
returnMessage = String(255, Space(1))

rv = checkuser(OperID, returnMessage)

说明:VB 的字符串变量已经是指针,因此用 ByVal。
系统崩溃,一般是返回值变量没有分配空间引起的。

zbl5174 2009-09-14
  • 打赏
  • 举报
回复

楼层弟兄们,天不帮我,还是不通,我把整个调试环境发给大家,请大家帮帮我。
匿名提取文件连接 http://pickup.mofile.com/7587685010050640
或登录Mofile,使用提取码 7587685010050640 提取文件

如果回复,也可以回复在别一篇帖子上,那一篇分值高
http://topic.csdn.net/u/20090914/18/fcfad119-87e6-4802-b1c1-7f9ab31e3773.html
谢谢大家
zbl5174 2009-09-14
  • 打赏
  • 举报
回复
我又按照楼层弟兄们的方法试了半天,没获成功,我把zdtlmti.dll给大家,
匿名提取文件连接 http://pickup.mofile.com/6119418299816050
或登录Mofile,使用提取码 6119418299816050 提取文件

这是对方提供的好使的Dephi声明
function checkuser(OperID: PChar; var returnMessage: pchar):Integer;stdcall; external 'zdtlmti.dll';
大家有空的帮我看看用VB能不能调通,调通的话把请把VB声明和调用示例给小弟发一下,先致非常之感激
Soyokaze 2009-09-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 slowgrace 的回复:]
声明为Long,传字符串缓冲区指针进去试试。

VB codePublic DeclareFunction checkuser Lib"zdtlmti.dll" _
(ByVal lpstrOperIDAsLong, ByVal lpstrReturnMessageAsLong)AsLongSub test()Dim strOperIdAsStringDim strMsgAsString
checkuser StrPtr(strOperId), StrPtr(strMsg)End Sub
[/Quote]

支持,可以试一下。此外,注意zdtlmti这个库接受的是ANSI字符还是UNICODE字符,是前者的话,还需要在此(传字符地址)之前用StrConv()函数转换一下。
slowgrace 2009-09-13
  • 打赏
  • 举报
回复
声明为Long,传字符串缓冲区指针进去试试。

Public Declare Function checkuser Lib "zdtlmti.dll" _
(ByVal lpstrOperID As Long, ByVal lpstrReturnMessage As Long) As Long

Sub test()
Dim strOperId As String
Dim strMsg As String
checkuser StrPtr(strOperId), StrPtr(strMsg)
End Sub
zbl5174 2009-09-13
  • 打赏
  • 举报
回复
几种情况我都试了,同样的错误,都快疯了,明天再和开发商联系吧,正常他们就应该提供几种常用语言的声明及调用代码,我只对应用的东西的感兴趣,一遇到这些系统的东西就犯愁
hanvan 2009-09-11
  • 打赏
  • 举报
回复
先试试ByRef再说
贝隆 2009-09-11
  • 打赏
  • 举报
回复
我也支持猴哥的。

或者你的声明方式不变,在引用时候这样引用试一试:

checkuser byval strptr(OperID),byval strptr(returnMessage)
chinaboyzyq 2009-09-11
  • 打赏
  • 举报
回复
可能说不太好,你先试试吧:

既然是指针,那就要送字符串的地址,而不是字符串的值:

Public Declare Function checkuser Lib "zdtlmti.dll" (ByRef OperID As String, ByRef returnMessage As String) As Long

1,486

社区成员

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

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