看我从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)
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)
可能的原因很多,就你的程序看,应该是参数的传递形式有问题:byval SM_ID As Long,byval FCS As long) As long
要用VarPtr函数取出变量地址
-------
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))调用后到是没错误提示但好像并没成功 帮帮忙我对指针实在是不清楚。
这个问题也曾经困扰我很久,结果还是改用了VC进行开发!(估计那一次是因为C函数没有以Std_Call 进行声明造成的)
老牛们,斑竹们!“授人以渔,而非授人以鱼”这才是问题的关键!
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
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沟通的分论坛了,呵呵
FCS 返回的是SC端失败原因
这两个都是数值型的
byMsgID是22个字节长的状态码
byMsgID可以这样获得字符型sMsgID=StrConv(byMsgID, vbUnicode)
http://expert.csdn.net/Expert/topic/2836/2836220.xml?temp=.3090479
(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