调用一个C++写的DLL。里面很多不同的数据类型和指针的应用具体的函数如下
C++的函数原型:int __stdcall GetDeliverSMExExEx
(
 ULONG* sm_ID, //返回:短讯ID
 unsigned char* DestTON, //返回:目标地址号码类型
 unsigned char* DestNPI,     //返回:目标地址编码方案
 char* DestAddr, //返回:目标地址
 unsigned char* OrgTON, //返回:源地址号码类型
 unsigned char* OrgNPI, //返回:源地址编码方案
 char* OrgAddr, //返回:源地址
 unsigned char* PRI, //返回:优先权
 unsigned char* RP,                   //返回:
 unsigned char* UDHI,                //返回:
 unsigned char* PID,      //返回:协议类型
 unsigned char* DCS, //返回:编码方案
 char* TimeStamp, //返回:下发时间
 unsigned long * UDLen,
 char* UserData,         //返回:用户数据
 unsigned char* StatusReport,              //返回:状态报告标志(0上行,1状态报告,2无信息)
 unsigned char* sMsgID,                  //返回:发送流水号与SubmitAExEx函数对应
 char* sSubmitdate,                       //返回
 char* sDonedate,                        //返回:发送流水号与SubmitAExEx函数对应
 char* sStatus,                           //返回:状态报告对应的错误码
 int iDeliverAckResult                   //应答错误码
 )
我把对应的类型查表转换后如下:
function GetDeliverSMExExEx
(
         sm_ID:DWORD;  //返回:短讯ID
         DestTON:PUchar;  //返回:目标地址号码类型
         DestNPI:PUchar;      //返回:目标地址编码方案
         DestAddr:PChar;  //返回:目标地址
         OrgTON:PUchar;  //返回:源地址号码类型
         OrgNPI:PUchar;  //返回:源地址编码方案
         OrgAddr:PChar;  //返回:源地址
         PRI:PUchar;  //返回:优先权
         RP: PUchar;                   //返回:
         UDHI:PUchar;                 //返回:
         PID:PUchar;       //返回:协议类型
         DCS:PUchar;  //返回:编码方案
         TimeStamp:PChar;  //返回:下发时间
         UDLen:DWORD;
         UserData:PChar;          //返回:用户数据
         StatusReport:PUchar;               //返回:状态报告标志(0上行,1状态报告,2无信息)
         sMsgID:PUchar;                  //返回:发送流水号与SubmitAExEx函数对应
         sSubmitdate:PChar;                        //返回
         sDonedate:PChar;                         //返回:发送流水号与SubmitAExEx函数对应
         sStatus:PChar;                            //返回:状态报告对应的错误码
         iDeliverAckResult:integer                    //应答错误码
 ):integer;stdcall;external 'SMEIDll.dll';       这里编译通过没有问题,即便是错的也应是会通过的,所以不知是不是全部对了
对方还是用C++调用的实例如下:
 iRet = GetDeliverSMExExEx(&ulsm_ID, &byDestTON, &byDestNPI, sDestAddr,
&byOrgTON, &byOrgNPI, sOrgAddr, &byPRI, &byRP, &byUDHI, &byPID, 
&byDCS, sTimeStamp, &ulUDLen, sUserData, &byStatusReport, 
sMsgID, sSubmitdate, sDonedate, sStatus, iDeliverAckResult);
if (iRet == 0) { //调用成功
这里&应当是对应delphi中@的,取的变量指针地址,但是替换掉,却编译不过,本人对于数据类很菜,所以在此请教了我改的如下: iRet = GetDeliverSMExExEx(@ulsm_ID, @byDestTON, @byDestNPI, sDestAddr,
@byOrgTON, @byOrgNPI, sOrgAddr, @byPRI, @byRP, @byUDHI, @byPID, 
@byDCS, sTimeStamp,@ulUDLen, sUserData, @byStatusReport, 
sMsgID, sSubmitdate, sDonedate, sStatus, iDeliverAckResult);
if (iRet == 0) { //调用成功
以上急待解决,急!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

解决方案 »

  1.   

    function GetDeliverSMExExEx 

           var sm_ID:DWORD; //返回:短讯ID 
           var DestTON:UINT; //返回:目标地址号码类型 
            var DestNPI:UINT;     //返回:目标地址编码方案 
            DestAddr:PChar; //返回:目标地址 
            var OrgTON:UINT; //返回:源地址号码类型 
            var OrgNPI:UINT; //返回:源地址编码方案 
            OrgAddr:PChar; //返回:源地址 
            var PRI:UINT; //返回:优先权 
            var RP: UINT;                  //返回: 
            var UDHI:UINT;                //返回: 
            var PID:UINT;     //返回:协议类型 
            var DCS:UINT; //返回:编码方案 
            TimeStamp:PChar; //返回:下发时间 
            var UDLen:DWORD; 
           UserData:PChar;         //返回:用户数据 
            var StatusReport:UINT;              //返回:状态报告标志(0上行,1状态报告,2无信息) 
            var sMsgID:UINT;                  //返回:发送流水号与SubmitAExEx函数对应 
            sSubmitdate:PChar;                        //返回 
            sDonedate:PChar;                        //返回:发送流水号与SubmitAExEx函数对应 
            sStatus:PChar;                            //返回:状态报告对应的错误码 
            iDeliverAckResult:integer                    //应答错误码 
    ):integer;stdcall;external 'SMEIDll.dll';
    //PChar变量都用char数组创建空间
    char[256] sDestAddr;
    ...
    iRet = GetDeliverSMExExEx(ulsm_ID, byDestTON, byDestNPI, sDestAddr, 
    byOrgTON, byOrgNPI, sOrgAddr, byPRI, byRP, byUDHI, byPID, 
    byDCS, sTimeStamp, ulUDLen, sUserData, byStatusReport, 
    sMsgID, sSubmitdate, sDonedate, sStatus, iDeliverAckResult);
      

  2.   

    把你Delphi中定义的实参亮出来,别人才知道是否有问题。
    PUchar改为PByte似乎更大众化一点。
      

  3.   

    lake的还是不对,第一个ulsm_ID就过不了
      

  4.   

    function GetDeliverSMExExEx 

            sm_ID:^DWORD; //返回:短讯ID 
            DestTON:PByte; //返回:目标地址号码类型 
            DestNPI:PByte;     //返回:目标地址编码方案 
            DestAddr:PByte; //返回:目标地址 
            OrgTON:PByte; //返回:源地址号码类型 
            OrgNPI:PByte; //返回:源地址编码方案 
            OrgAddr:PChar; //返回:源地址 
            PRI:PByte; //返回:优先权 
            RP: PByte;                  //返回: 
            UDHI:PByte;                //返回: 
            PID:PByte;     //返回:协议类型 
            DCS:PByte; //返回:编码方案 
            TimeStamp:PChar; //返回:下发时间 
            UDLen:^DWORD; 
            UserData:PChar;         //返回:用户数据 
            StatusReport:PByte;              //返回:状态报告标志(0上行,1状态报告,2无信息) 
            sMsgID:PByte;                  //返回:发送流水号与SubmitAExEx函数对应 
            sSubmitdate:PByte;                        //返回 
            sDonedate:PChar;                        //返回:发送流水号与SubmitAExEx函数对应 
            sStatus:PChar;                            //返回:状态报告对应的错误码 
            iDeliverAckResult:integer                    //应答错误码 
    ):integer;stdcall;external 'SMEIDll.dll';ULONG * 在C++中是一个指针
      

  5.   

    这里关键是怎样在实例中能编译过去,也就是对方的C++实例中,我在delphi中应怎样的实现或怎样的写才是正确的并编译过去和能运行没有错,不用实参,对方在C++中也没有实参,这个本来就是通过形参再获取实参的;如:
    iRet = GetDeliverSMExExEx(&ulsm_ID, &byDestTON, &byDestNPI, sDestAddr, 
    &byOrgTON, &byOrgNPI, sOrgAddr, &byPRI, &byRP, &byUDHI, &byPID, 
    &byDCS, sTimeStamp, &ulUDLen, sUserData, &byStatusReport, 
    sMsgID, sSubmitdate, sDonedate, sStatus, iDeliverAckResult); 
    if (iRet == 0) { MsgStr=userData}//这样得到实参,有点像过程了,