小弟最近给医保做接口,对方提代的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是指针,小弟一看是指针就蒙,哪位同行有相关的经验,分享一下吧,我先致以最真诚的感谢
(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找不到外部文件导致.
特别感谢这些天各楼层弟兄的顶力帮助,祝大家国庆快乐!