在unit中声明:function CMPP3Submit;external 'SMEIDLL.DLL' name 'CMPP3Submit';
然后在 unit2的 btn1的onclick中调用:cmpp3submit OK,没问题:
但是把  CMPP3Submit 写到  cmppsub函数中,再从 btn1的 onclick中调用 cmppsub
则dll报错,为什么?
也就是说,直接调用OK,间接调用就出错
注:CMPP3Submit带有二十多个参数,我省略了

解决方案 »

  1.   

    >>但是把  CMPP3Submit 写到  cmppsub函数中,再从 btn1的 onclick中调用 cmppsub
    则dll报错,你没写出是什么的错,无法判断可能你的 cmppsub 没有引用 dll 声明的unit最大可能是你参数输入错了
      

  2.   

    aiirii: btn1 的 onclick 与 cmppsub 在同一个unit内,引用dll的unit是肯定的,要不然 btn1调用该函数也会出错了,现在查出来是参数有问题,有几个参数(char,pchar类型)只能在直接调用该函数(CMPP3Submit)的地方定义,定义在其它地方运行就报错,错误为 :Access Violation at address 1003CCF7 in module 'SMEIDLL.Dll' write of address 
    0048ED30
     yeszq:我是分两部份声明的:
    在 interface 部份 
    function CMPP3Submit(byPKTotal:char;
                         byPKNumber:Char;
                         SRR:Char;
                         byMsgLevel: Char;
                         ServiceSubType: PChar;
                         byFeeUserType: Char;
                         sFeeAddr: PChar;
                         byFeeTerminalType:Char;
                         PID: Char;
                         Default_ID: LongWord;
                         UDHI:Char;
                         DCS: Char;
                         sSPID:PChar;
                         sFeeType: PChar;
                         sFeeCode: PChar;
                         Schedule: PChar;
                         Expire: PChar;
                         OrgAddr: PChar;
                         byUserNum: Char;
                         sDestAddrs: PChar;
                         byDestTerminalType: Char;
                         UDLen: longWord;
                         UserData: PChar;
                         sLinkID: PChar;
                         byMsgID: PChar): Integer; stdcall;这是函数说明(参数有点多,呵呵)在 implementation 部份 function CMPP3Submit;  external 'SMEIDLL.DLL' name 'CMPP3Submit';
    这是外部函数声明
      

  3.   

    為什麼分2部分聲明?
    function CMPP3Submit(byPKTotal:char;
    byPKNumber:Char;
    SRR:Char;
    byMsgLevel: Char;
    ServiceSubType: PChar;
    byFeeUserType: Char;
    sFeeAddr: PChar;
    byFeeTerminalType:Char;
    PID: Char;
    Default_ID: LongWord;
    UDHI:Char;
    DCS: Char;
    sSPID:PChar;
    sFeeType: PChar;
    sFeeCode: PChar;
    Schedule: PChar;
    Expire: PChar;
    OrgAddr: PChar;
    byUserNum: Char;
    sDestAddrs: PChar;
    byDestTerminalType: Char;
    UDLen: longWord;
    UserData: PChar;
    sLinkID: PChar;
    byMsgID: PChar): Integer; stdcall;external 'SMEIDLL.DLL' name 'CMPP3Submit'這樣聲明TRY下,注意是靜態調用.在 implementation 部份
      

  4.   

    分两部份是因这我要从这个DLL中输出很多个函数,不想直接放在使用它的那个unit,这些函数统一放在一个单元内声明,然后其它单元再调用它们,调用方法是静态的,问题出在参数上,有些参数能间接调用,有些不行