小弟最近给医保做接口,对方提代的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是指针,小弟一看是指针就蒙,哪位同行有相关的经验,分享一下吧,我先致以最真诚的感谢
对方的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是指针,小弟一看是指针就蒙,哪位同行有相关的经验,分享一下吧,我先致以最真诚的感谢
解决方案 »
- 请问API函数URLDownloadToCacheFile最后一个参数TLPBINDSTATUSCALLBACK结构如何定义呢?
- 谁用过这个VB的DES算法例子?
- 在线求救啊。关于操作EXCEL的问题,各位大大一定要救命啊,磕头了,另献上100分
- 局域网中传送图片问题,能帮助我解决该问题,谢谢了,100分就是您的!
- 文本框光标问题
- 软件下载
- 高手,你们的QQ号是多少啊,来登记吧!
- 怎样用sql语句得到特定记录集,比如10-20行的纪录
- 初学VB,各位大哥大姐们前来帮帮忙啊,运行时出现编译错误,“未找到方法或数据成员”,小妹在此先谢过各位啦!
- 谁能解释一下文件句柄,最好能聚个例子,谢谢!
- VB如何防止程序被关闭
- 请问VB6中使某个方法同步怎样实现?类似于Java中的synchronized
(ByVal lpstrOperID As Long, ByVal lpstrReturnMessage As Long) As LongSub test()
Dim strOperId As String
Dim strMsg As String
checkuser StrPtr(strOperId), StrPtr(strMsg)
End Sub
支持,可以试一下。此外,注意zdtlmti这个库接受的是ANSI字符还是UNICODE字符,是前者的话,还需要在此(传字符地址)之前用StrConv()函数转换一下。
匿名提取文件连接 http://pickup.mofile.com/6119418299816050
或登录Mofile,使用提取码 6119418299816050 提取文件这是对方提供的好使的Dephi声明
function checkuser(OperID: PChar; var returnMessage: pchar):Integer;stdcall; external 'zdtlmti.dll';
大家有空的帮我看看用VB能不能调通,调通的话把请把VB声明和调用示例给小弟发一下,先致非常之感激
楼层弟兄们,天不帮我,还是不通,我把整个调试环境发给大家,请大家帮帮我。
匿名提取文件连接 http://pickup.mofile.com/7587685010050640
或登录Mofile,使用提取码 7587685010050640 提取文件 如果回复,也可以回复在别一篇帖子上,那一篇分值高
http://topic.csdn.net/u/20090914/18/fcfad119-87e6-4802-b1c1-7f9ab31e3773.html
谢谢大家
----------------------------------------------------------------------------------
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 LongOperID = "123456"'返回值变量一点要分配空间
returnMessage = String(255, Space(1))rv = checkuser(OperID, returnMessage)说明:VB 的字符串变量已经是指针,因此用 ByVal。
系统崩溃,一般是返回值变量没有分配空间引起的。
这个动态库似乎有问题。OperID 有什么约束条件吗?
函数的调用格式为:
int 函数名(char* OperID , char* returnMessage);
operId为全球唯一不重复标识码GUID,长度为38位,格式如
{F9AEE43D-E6B6-4787-84CC-FCB92F05A9DC},由系统在调用接口函数前生成,作为本次调用接口函数的入口和出口数据唯一标识。
ReturnMessage传入时为长度不小于200的空字符组成的串,在函数执行完成后,可以通过returnMessage来获取函数中文提示信息
然后再修改ClientConfig.ini中的[DB]下的配置
在网上找了一些有关DEPHI 的var参数的一些区别,以上各位并没有注意到这个var,也许以为变量,就是变量吧。
这个var加上参数的时候,DEPHI会做一些特殊的处理:自动转变这一参数为一个地址
按照我的理解,这个声明如果转化成VB语言的话,应该是
function checkuser(Byval OperID As String,
Byref returnMessage As String) as Integer
[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找不到外部文件导致.
特别感谢这些天各楼层弟兄的顶力帮助,祝大家国庆快乐!