看我从VC翻译到VB的函数是否正确,为方便观看特意分段显示
VC 代码 (声明函数)
-----------------
int WINAPI SubmitAExEx(
unsigned char OrgTON
, unsigned char OrgNPI
, LPCSTR OrgAddr
, unsigned char DestTON
, unsigned char DestNPI
, LPCSTR DestAddr
, unsigned char PRI
, unsigned char RD
, unsigned char RP
, unsigned char SRR
, unsigned char MR
, unsigned char DCS
, unsigned char PID
, LPCSTR Schedule
, LPCSTR Expire
, unsigned long Default_ID
, unsigned char UDHI
, unsigned long UDLen
, LPCSTR UserData
, LPCSTR ServiceSubType
, unsigned char* byMsgID
, unsigned char byPKTotal
, unsigned char byPKNumber
, unsigned char byMsglevel
, unsigned char byFeeUserType
, LPCSTR sSPID
, LPCSTR sFeeType
, LPCSTR sFeeAddr
, LPCSTR sFeeCode
, unsigned char byUserNum
, LPCSTR sDestAddrs
, unsigned long* SM_ID
, unsigned char* FCS)
翻译后的VB 代码 (声明函数)
---------------
Public Declare Function SubmitAExEx Lib "SMEIDll.dll" (
ByVal OrgTON As Byte
, ByVal OrgNPI As Byte
, ByVal OrgAddr As String
, ByVal DestTON As Byte
, ByVal DestNPI As Byte
, ByVal DestAddr As String
, ByVal PRI As Byte
, ByVal RD As Byte
, ByVal RP As Byte
, ByVal SRR As Byte
, ByVal MR As Byte
, ByVal DCS As Byte
, ByVal PID As Byte
, ByVal Schedule As String
, ByVal Expire As String
, ByVal Default_ID As Long
, ByVal UDHI As Byte
, UDLen As Long
, ByVal UserData As String
, ByVal ServiceSubType As String
, byMsgID As Byte
, ByVal byPKTotal As Byte
, ByVal byPKNumber As Byte
, ByVal ByMsglevel As Byte
, ByVal byFeeUserType As Byte
, ByVal sSPID As String
, ByVal sFeeType As String
, ByVal sFeeAddr As String
, ByVal sFeeCode As String
, ByVal byUserNum As Byte
, ByVal sDestAddrs As String
, SM_ID As Long
, FCS As Byte) As Integer
VC 代码 (调用函数)
---------------------------
iRet = SubmitAExEx(OrgTON,OrgNPI,sadd,DestTON,DestNPI,dadd,PRI,0,0, \
                   bySRR,0,DCS,PID,schedule,expire,default_id,UDHI,UDLen, LPCSTR)ud,\
                   (LPCSTR)ServiceSubType, byMsgID/*new*/, byPKTotal/*new*/,  \
                   byPKNumber/*new*/, byMsgLevel/*new*/,  byFeeUserType/*new*/, \
                  sSPID/*new*/, sFeeType/*new*/, sFeeAddr/*new*/, sFeeCode/*new*/,  \
byUserNum/*new*/, sDestAddrs/*new*/,  &SM_ID,&FCS);
翻译的VB 代码 (调用函数)
---------------------------
iRet = SubmitAExEx(OrgTON,OrgNPI,sadd,DestTON,DestNPI,dadd,PRI,0,0,ud,ServiceSubType, byMsgID, byPKTotal, byPKNumber, byMsgLevel, byFeeUserType, sSPID, sFeeType, sFeeAddr, sFeeCode, byUserNum, sDestAddrs, SM_ID, FCS)

解决方案 »

  1.   

    所有的指针都要翻译成 long 吗? 为什么呢?
      

  2.   

    调用上面程序时出现一个错误这一般是什么问题?“0x779b9416"指令引用的“0x3030302c”内存。该内存不能为“read”。
      

  3.   

    //调用上面程序时出现一个错误这一般是什么问题?
    可能的原因很多,就你的程序看,应该是参数的传递形式有问题:byval SM_ID As Long,byval FCS As long) As long
      

  4.   

    //还是不行 up你是怎么调用的?用varptr取得变量地址了吗?
      

  5.   

    9494,,,同意老大得,,,对于指针,,,byval FCS As long,
    要用VarPtr函数取出变量地址
      

  6.   

    我现在是这样做的声明
    -------
    Public Declare Function SubmitAExEx _
    Lib "SMEIDll.dll" (ByVal OrgTON As Byte, ByVal OrgNPI As Byte _
    , ByVal OrgAddr As String, ByVal DestTON As Byte _
    , ByVal DestNPI As Byte, ByVal DestAddr As String _
    , ByVal PRI As Byte, ByVal RD As Byte _
    , ByVal RP As Byte, ByVal SRR As Byte _
    , ByVal MR As Byte, ByVal DCS As Byte _
    , ByVal PID As Byte, ByVal Schedule As String _
    , ByVal Expire As String, ByVal Default_ID As Long _
    , ByVal UDHI As Byte, ByVal UDLen As Long _
    , ByVal UserData As String, ByVal ServiceSubType As String _
    , byval byMsgID As Long, ByVal byPKTotal As Byte _
    , ByVal byPKNumber As Byte, ByVal ByMsglevel As Byte _
    , ByVal byFeeUserType As Byte, ByVal sSPID As String _
    , ByVal sFeeType As String, ByVal sFeeAddr As String _
    , ByVal sFeeCode As String, ByVal byUserNum As Byte _
    , ByVal sDestAddrs As String, byval SM_ID As Long,byval FCS As Byte) As Long
    其中:byMsgID ,SM_ID , FCS 是指针类型 是调用函数后才返回的参数调用
    -----
      RStr = SubmitAExEx(sOrgTON, sOrgNPI, sOrgAddr, sDestTON, sDestNPI, sDestAddr, sPRI, sRD, sRP, sSRR, sMR, sDCS, sPID, sSchedule, sExpire, sDefault_ID, sUDHI, sUDLen, sUserData, sServiceSubType, VarPtr(sbyMsgID), sbyPKTotal, sbyPKNumber, sByMsglevel, sbyFeeUserType, sSPID, sFeeType, sFeeAddr, sFeeCode, sbyUserNum, sDestAddrs, VarPtr(sSM_ID), VarPtr(sFCS))调用后到是没错误提示但好像并没成功 帮帮忙我对指针实在是不清楚。
      

  7.   

    我改成 byval SM_ID As Long,byval FCS As long) As Long调用函数有反应了但又出现 该内存不能为“read”。的错误?!
      

  8.   

    我看还是请大家谈谈Windows中变量的内存分配机制吧!
    这个问题也曾经困扰我很久,结果还是改用了VC进行开发!(估计那一次是因为C函数没有以Std_Call 进行声明造成的)
    老牛们,斑竹们!“授人以渔,而非授人以鱼”这才是问题的关键!
      

  9.   

    Public Declare Function SubmitAExEx _
        Lib "smeidll" (ByVal OrgTON As Byte, _
                        ByVal OrgNPI As Byte, ByVal OrgAddr As String, _
                        ByVal DestTON As Byte, ByVal DestNPI As Byte, _
                        ByVal DestAddr As String, ByVal PRI As Byte, _
                        ByVal RD As Byte, ByVal RP As Byte, _
                        ByVal SRR As Byte, ByVal MR As Byte, _
                        ByVal DCS As Byte, ByVal PID As Byte, _
                        ByVal Schedule As String, ByVal Expire As String, _
                        ByVal Default_ID As Long, ByVal UDHI As Byte, _
                        ByVal UDLen As Long, ByVal UserData As String, _
                        ByVal sServiceType As String, ByVal byMsgID As Long, _
                        ByVal byPKTotal As Byte, ByVal byPKNumber As Byte, _
                        ByVal byMsglevel As Byte, ByVal byFeeUserType As Byte, _
                        ByVal sSPID As String, ByVal sFeeType As String, _
                        ByVal sFeeAddr As String, ByVal sFeeCode As String, _
                        ByVal byUserNum As Byte, ByVal sDestAddrs As String, _
                        ByRef SM_ID As Long, ByRef FCS As Byte) As Long
      

  10.   

    to supergreenbean(超级绿豆) 你给的代码不行啊?你怎么调用的呢?
      

  11.   

    Dim byMsgID(22) As Byte, UserData As String, UDLen As Long,FCS As Byte, SM_ID As Long
        Dim iRet As Long
        UserData = txtMsg.Text
        UDLen = LenB(StrConv(UserData, vbFromUnicode))
        
        iRet = SubmitAExEx(2, 1, txtFrom.Text, 2, 1, txtTo.Text, 0, 0, 0, 0, 0, 15, 0, _
                "", "", 0, 0, UDLen, UserData, "icp", _
                VarPtr(byMsgID(0)), 1, 1, 0, 1, "spid", _
                "1", "", "11", _
                1, txtTo.Text, _
                SM_ID, FCS)另外,to rainstormmaster(暴风雨 v2.0):我觉得这里似乎得再开个VC-VB沟通的分论坛了,呵呵
      

  12.   

    to  supergreenbean(超级绿豆)可以了但怎么byMsgID , SM_ID, FCS 返回的都是乱码,如何才能正确读取呢?谢谢!~
      

  13.   

    这位兄弟要仔细看看开发文档啊SM_ID 返回的是短消息ID
    FCS 返回的是SC端失败原因
    这两个都是数值型的
    byMsgID是22个字节长的状态码
    byMsgID可以这样获得字符型sMsgID=StrConv(byMsgID, vbUnicode)
      

  14.   

    to  supergreenbean(超级绿豆)非常感谢你 请到这来领分 不够的话我再开个贴送分。
    http://expert.csdn.net/Expert/topic/2836/2836220.xml?temp=.3090479
      

  15.   

    to  supergreenbean(超级绿豆)再问个问题 你的 GetDeliverSMExExEx 是怎样声明和调用的呢?我怎么读不出消息内容来?万分感谢你的帮助!呵呵~
      

  16.   

    Public Declare Function GetDeliverSMExExEx Lib "smeidll" _
                        (SM_ID As Long, DestTON As Byte, _
                        DestNPI As Byte, ByVal DestAddr As Long, _
                        OrgTON As Byte, OrgNPI As Byte, _
                        ByVal OrgAddr As Long, PRI As Byte, _
                        RP As Byte, UDHI As Byte, _
                        PID As Byte, DCS As Byte, _
                        ByVal TimeStamp As Long, UDLen As Long, _
                        ByVal UserData As Long, StatusReport As Byte, _
                        ByVal sMsgID As Long, ByVal sSubmitdate As Long, _
                        ByVal sDoneDate As Long, ByVal sStatus As Long) As Long
      

  17.   

    这个函数都是返回的信息。如果要接受数值型的返回值,你只要byref传递你的变量就好了,如果你要接收字符串型的数据,那你就要根据文档要求构造不同长度的字节数组,然后用varptr(b(0))来把字节数组的首地址传给那个函数。你可以参照上面SubmitAExEx的样子