小弟最近给医保做接口,对方提代的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是指针,小弟一看是指针就蒙,哪位同行有相关的经验,分享一下吧,我先致以最真诚的感谢

解决方案 »

  1.   

    可能说不太好,你先试试吧:既然是指针,那就要送字符串的地址,而不是字符串的值:Public Declare Function checkuser Lib "zdtlmti.dll" (ByRef OperID As String, ByRef returnMessage As String) As Long
      

  2.   

    我也支持猴哥的。或者你的声明方式不变,在引用时候这样引用试一试:checkuser byval strptr(OperID),byval strptr(returnMessage)
      

  3.   

    声明为Long,传字符串缓冲区指针进去试试。Public Declare Function checkuser Lib "zdtlmti.dll" _
        (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
      

  4.   


    支持,可以试一下。此外,注意zdtlmti这个库接受的是ANSI字符还是UNICODE字符,是前者的话,还需要在此(传字符地址)之前用StrConv()函数转换一下。
      

  5.   

    我又按照楼层弟兄们的方法试了半天,没获成功,我把zdtlmti.dll给大家,
    匿名提取文件连接 http://pickup.mofile.com/6119418299816050
    或登录Mofile,使用提取码 6119418299816050 提取文件这是对方提供的好使的Dephi声明
    function checkuser(OperID: PChar; var returnMessage: pchar):Integer;stdcall; external 'zdtlmti.dll';
    大家有空的帮我看看用VB能不能调通,调通的话把请把VB声明和调用示例给小弟发一下,先致非常之感激
      

  6.   

      
    楼层弟兄们,天不帮我,还是不通,我把整个调试环境发给大家,请大家帮帮我。
    匿名提取文件连接 http://pickup.mofile.com/7587685010050640  
    或登录Mofile,使用提取码 7587685010050640 提取文件 如果回复,也可以回复在别一篇帖子上,那一篇分值高
    http://topic.csdn.net/u/20090914/18/fcfad119-87e6-4802-b1c1-7f9ab31e3773.html
    谢谢大家
      

  7.   

    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 LongOperID = "123456"'返回值变量一点要分配空间
    returnMessage = String(255, Space(1))rv = checkuser(OperID, returnMessage)说明:VB 的字符串变量已经是指针,因此用 ByVal。
    系统崩溃,一般是返回值变量没有分配空间引起的。
      

  8.   


    这个动态库似乎有问题。OperID 有什么约束条件吗?
      

  9.   

    文档中关于接口参数的说明如下
    函数的调用格式为:
    int 函数名(char* OperID , char* returnMessage);
    operId为全球唯一不重复标识码GUID,长度为38位,格式如
    {F9AEE43D-E6B6-4787-84CC-FCB92F05A9DC},由系统在调用接口函数前生成,作为本次调用接口函数的入口和出口数据唯一标识。
    ReturnMessage传入时为长度不小于200的空字符组成的串,在函数执行完成后,可以通过returnMessage来获取函数中文提示信息
      

  10.   

    我问接口工程师说这个zdtlmti.dll是用Dephi写的,说在dephi和pb下调用好使,但是没做过vb的调用测试
      

  11.   

    接口商人家是写Dll的,咱这种搞应用的,人家说好使就好使呗,哪个还说个"不"字,我现在让大伙一起看看,如果解决了那就是帮了我的大忙,毕竟客户还等着交差,解决不了,那也是帮了我的忙,我就可以和人家叫板了,说他们的Dll有问题,弟兄们,给我点力量吧!
      

  12.   

    我这里测试的情况,无论是否编译后执行,都是数秒无响应,然后因错误退出。楼主,这个 DLL 运行没有其他条件吗?比如,是否需要数据库?
      

  13.   

    这个DLL运行是需要sql server2000数据库,有两个表需要通过执行[interface脚本.sql]生成,
    然后再修改ClientConfig.ini中的[DB]下的配置
      

  14.   

    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
      

  15.   

    终于弄明白是怎么回事了,原来的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找不到外部文件导致. 
    特别感谢这些天各楼层弟兄的顶力帮助,祝大家国庆快乐!