该DLL用C写的,其中一个函数原型如下:
int WINAPI SubmitAExEx(unsigned char OrgTON, unsigned char OrgNPI, LPCTSTR OrgAddr,unsigned char DestTON, unsigned char DestNPI, LPCTSTR DestAddr, unsigned char PRI, unsigned char RD, unsigned char RP,unsigned char SRR, unsigned char MR, unsigned char DCS,unsigned char PID, LPCTSTR Schedule, LPCTSTR Expire, unsigned long Default_ID, unsigned char UDHI, unsigned long UDLen,LPCTSTR UserData, LPCTSTR ServiceSubType, unsigned char* byMsgID, unsigned char byPKTotal, unsigned char byPKNumber, unsigned char byMsglevel, unsigned char byFeeUserType, LPCTSTR sSPID, LPCTSTR sFeeType,LPCTSTR sFeeAddr, LPCTSTR sFeeCode,unsigned char byUserNum, LPCTSTR 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, ByVal udlen As Long, _
ByVal UserData As String, ByVal sServiceType As String, _
ByVal 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, ByRef SM_ID As Long, _
ByRef FCS As Byte) As Long不知道对不对,调用如下:
Private Sub Cmpp_Send_TestMessage()
TempDestAddr = "12345678944"
TempUserData = "你好,测试!"
a = SubmitAExEx _
(CByte(TempOrgTON), CByte(TempOrgNPI), _
TempOrgAddr, CByte(TempDestTON), _
CByte(TempDestNPI), TempDestAddr, _
CByte(TempPRI), CByte(TempRD), _
CByte(TempRP), CByte(TempSRR), _
CByte(TempMR), CByte(TempDCS), _
CByte(TempPID), TempSchedle, _
TempExpire, TempDefault_ID, _
CByte(TempUDHI), TempUDLen, _
TempUserData, TempsServiceType, _
CByte(TempbyMsgID), CByte(TempbyPKTotal), _
CByte(TempbyPKNumber), CByte(TempbyMsglevel), _
CByte(TempbyFeeUserType), TempsSPID, _
TempsFeeType, TempsFeeAddr, _
TempsFeeCode, CByte(TempbyUserNum), _
TempsDestAddrs, SM_ID, FCS)
End Sub其中temp*全是我定义的变量,
如果不运行一下两句,程序返回正常:
TempDestAddr = "12345678944"
TempUserData = "你好,测试!"
如果一运行,就提示程序引用了不可读的内存,出错,自动退出!!!!
郁闷啊!!!请大虾救救我………………
(我自己怀疑是我的数据类型转换不对,我对C的数据类型不是很熟)请大家不吝指点迷津……………………
int WINAPI SubmitAExEx(unsigned char OrgTON, unsigned char OrgNPI, LPCTSTR OrgAddr,unsigned char DestTON, unsigned char DestNPI, LPCTSTR DestAddr, unsigned char PRI, unsigned char RD, unsigned char RP,unsigned char SRR, unsigned char MR, unsigned char DCS,unsigned char PID, LPCTSTR Schedule, LPCTSTR Expire, unsigned long Default_ID, unsigned char UDHI, unsigned long UDLen,LPCTSTR UserData, LPCTSTR ServiceSubType, unsigned char* byMsgID, unsigned char byPKTotal, unsigned char byPKNumber, unsigned char byMsglevel, unsigned char byFeeUserType, LPCTSTR sSPID, LPCTSTR sFeeType,LPCTSTR sFeeAddr, LPCTSTR sFeeCode,unsigned char byUserNum, LPCTSTR 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, ByVal udlen As Long, _
ByVal UserData As String, ByVal sServiceType As String, _
ByVal 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, ByRef SM_ID As Long, _
ByRef FCS As Byte) As Long不知道对不对,调用如下:
Private Sub Cmpp_Send_TestMessage()
TempDestAddr = "12345678944"
TempUserData = "你好,测试!"
a = SubmitAExEx _
(CByte(TempOrgTON), CByte(TempOrgNPI), _
TempOrgAddr, CByte(TempDestTON), _
CByte(TempDestNPI), TempDestAddr, _
CByte(TempPRI), CByte(TempRD), _
CByte(TempRP), CByte(TempSRR), _
CByte(TempMR), CByte(TempDCS), _
CByte(TempPID), TempSchedle, _
TempExpire, TempDefault_ID, _
CByte(TempUDHI), TempUDLen, _
TempUserData, TempsServiceType, _
CByte(TempbyMsgID), CByte(TempbyPKTotal), _
CByte(TempbyPKNumber), CByte(TempbyMsglevel), _
CByte(TempbyFeeUserType), TempsSPID, _
TempsFeeType, TempsFeeAddr, _
TempsFeeCode, CByte(TempbyUserNum), _
TempsDestAddrs, SM_ID, FCS)
End Sub其中temp*全是我定义的变量,
如果不运行一下两句,程序返回正常:
TempDestAddr = "12345678944"
TempUserData = "你好,测试!"
如果一运行,就提示程序引用了不可读的内存,出错,自动退出!!!!
郁闷啊!!!请大虾救救我………………
(我自己怀疑是我的数据类型转换不对,我对C的数据类型不是很熟)请大家不吝指点迷津……………………
解决方案 »
- 奇怪:用adodb.command调用存储过程,没调用refresh,老自动填充上了parameters集合!
- 程序开着无法关机?
- 如何验证一个EMAIL地址是否有效!
- 我机上有几个网卡,如何获取每个网卡的IP,网关,DNS地址?,如何判断网卡是连接还是断开?.请高手赐教!!!!
- 请高手帮帮忙~~不会的也来看,搞定马上结贴,谢谢啦
- 我用这个函数Space$(nSize),提示说工程库没有,需要什么工程库?
- 请问有没有可以将word文档转换成html的控件?
- help?
- 怎样从access里面调入图片?
- VB的最新补订是多少?在那里可以下载或得到它?
- VB问题,菜鸟水平!!!
- lebel如何以百叶窗那样显示出来?
[email protected]
---- 在VC++代码中用#define定义常量,而在VB中是用Const来定义,因此转换成VB的代码是: Public Const STD_COPY=1
---- 第二个例子: #define LB_SELECTSTRING0x018C //WINUSER.h
---- 这有一个问题,VC++中所有以"0x"开头的值是十六进制,而在VB中表示十六进制要用"&H"开头.因此转换成VB的代码为: Const LB_SELECTSTRING = 0x018C
---- 第三个例子: #define TCN_FIRST(0U-550U)
---- 这里有个特别的是定义的值是以"U"结尾,这是意味着该常量的类型是"unsigned long"(在VB中不支持 该数据类型).但是unsigned long和signed long(在VB中是Long)两种数据类型的值在存储方式上是一样 的,只是表现的形式不同.因此,我们只需要去掉末尾的"U"就可以了. Const TCN_FIRST=(0-550) 这同样适合以"L"结尾的值
---- 另外,对于 #define CDDS_ITEMPOSTERASE(CDDS_ITEM | CDDS_POSTERASE),我们需要用"Or"来取代"|" ---- 2.结构的定义 ---- 我们先看VC++定义的一个比较简单的结构: typedef struct tagTBSAVEPARAMSA{
HKEY hkr;
LPCSTR pszSubKey;
LPCSTR pszValueName;
}TBSAVEPARAMSA,FAR* LPTBSAVEPARAMSA;
---- 首先我们需要把第一行的"typedef struct"转换成"Public Type" Public Type tagTBSAVEPARAMSA
---- 然后处理结构成员, HKEY hkr;
LPCSTR pszSubKey;
LPCSTR pszValueName;
---- 对于第一个成员类型HKEY.我们要知道VC++中的以"H"开头的大部分数据类型代表的是某种句柄.在VB中每一个Form对象和许多控件都有一个hWnd属性,它代表所属窗口的句柄.hWnd的类型是Long,并且所有用来存储句柄的变量类型都是Long.因此,该成员在VB中定义为: hkr As Long
---- 同样的,VC++数据类型LPSTR和LPCSTR代表指向字符串的指针,在VB中可以当作String类型.因为当你传送结构给API时,VB将把结构中所有的String转换成指向ANSI字符串的指针.因此后两个成员在VB中表示为:
pszSubKey As String
pszValueName As String
对于最后一行"}TBSAVEPARAMSA,FAR*
LPTBSAVEPARAMSA;"我们只需要用
"End Type"取代---- 就可以了.转换成VB代码后完整的结构为:
Public Type tagTBSAVEPARAMSA
hkr As Long
pszSubKey As String
pszValueName As String
End Type---- 以下是VC++中数据类型对应到VB中的数据类型VC++数据类型VB数据类型------------------------------------
short Integer
intLong
long Long
UNIT Long
ULONG Long
WORD,DWORD Long
WPARAM,LPARAM Long
WMSG,UMSGLong
HRESULT Long
BOOL Boolean
COLORREF Long
HWND,HDC,HBRUSH,HKEY,等等. Long
LPSTR,LPCSTRString
LPWSTR,OLECHAR,BSTR String
LPTSTRString
VARIANT_BOOLBoolean
unsigned char Byte
BYTE Byte
VARIANT Variant
(任何以*或**结尾的数据类型)Long
---- 3.函数的转换 ---- 我们知道VB提供了API Viewer add-in,但是有很多API函数它并没有包括在内. 因此知道如何把VC++函数转换成VB的函数格式是非常重要的.先看第一个例子: WINCOMMCTRLAPI HWND WINAPI
CreateStatusWindowsA(LONG style,
LPCSTR lpszTest,HWND hwndParent,UINT wID);
---- 这个函数创建一个StatusBar控件.从WINCOMMCTRLAPI可以得知该函数来自动态 链接库ComCtl32.dll.(有时,我们需要从MSDN中查找某函数对应的DLL) 然后我们知道该函数的返回类型是HWND,对应VB的类型是Long.最后,根据前面提到 类型对应表,很容易的转换相应的函数参数. Public Declare Function CreateStatusWindowA Lib
"ComCtl32.dll" _
(Byval style As Long, _
Byval lpszText As String, _
Byval hwndParent As Long,Byval wID As Long) As Long