现需要用VB开发一个基于移动网关短信平台的程序。
动态连接库名称:smepdll.dll
导出函数申明头文件(部分):
//B ==================================================================
//B 名称:SMEP_Connect
//B 功能:连接服务器
//B
//B 入口:
//B const char *IN_pServerIP, - 服务器IP地址
//B int IN_Port, - 服务器端口
//B int IN_ProxyType, - 代理类型(0-无代理,1-socks4代理,2-socks5代理)
//B char IN_pProxyIP, - 代理服务器IP地址
//B char IN_ProxyPort, - 代理服务器端口
//B BOOL bProxyAuth, - 代理服务器是否验证身份
//B char IN_pProxyUserID, - 代理用户ID
//B char IN_pProxyPassword, - 代理用户密码
//B int IN_ConnectType, - 连接方式:0 MT / 1 MO / 2 查询服务器
//B const char *IN_pECode, - 企业短号
//B const char *IN_pUserName, - 用户名
//B const char *IN_pPassword, - 密码
//B const char *IN_pZoneID, - 所属区号
//B unsigned int IN_OverTime, - 超时的时间(秒)
//B int *OUT_pStatus - 返回连接状态
//B
//B 出口:
//B int >=0 成功,返回的是连接句柄。 OUT_pStatus=0
//B -1 , OUT_pStatus 中放 DLL 定义错误码。 (参见 DllErrCode.h)
//B -2 , OUT_pStatus 中放 服务器返回错误码。
//B (如果连接 MT 服务器, 参见 MtDllErrCode.h)
//B (如果连接 MO 服务器, 参见 MoDllErrCode.h)
//B (如果连接 查询 服务器, 参见 MqDllErrCode.h)
//B ==================================================================
extern "C" DLLSMEPAPI int __cdecl SMEP_Connect(
const char *IN_pServerIP,
int IN_Port,
int IN_ProxyType,
const char* IN_pProxyIP,
int IN_ProxyPort,
int IN_ProxyAuth,
const char* IN_pProxyUserID,
const char* IN_pProxyPassword,
int IN_ConnectType,
const char *IN_pID,
const char *IN_pUserName,
const char *IN_pPassword,
const char *IN_pZoneID,
unsigned int IN_OverTime,
int *OUT_pStatus); //================================================================
对于以上函数我在VB中进行如下声明:
Public Declare Function UF_SMEP_Connect Lib "smepdll.dll" Alias "SMEP_Connect" _
(ByVal IN_pServerIP As String, ByVal IN_Port As Long, ByVal IN_ProxyType As Long _
, ByVal IN_pProxyIP As String, ByVal IN_ProxyPort As String, ByVal bProxyAuth As Long _
, ByVal IN_pProxyUserID As String, ByVal IN_pProxyPassword As String, ByVal IN_ConnectType As Long _
, ByVal IN_pECode As String, ByVal IN_pUserName As String, ByVal IN_pPassword As String _
, ByVal IN_pZoneID As String, ByVal IN_OverTime As Long, ByRef OUT_pStatus As Long) As Long调用时提示“实时错误'49' DLL调用约定错误”请问,此声明有什么问题,是不是cdecl标准的动态连接库不能在VB中使用,谢谢。
动态连接库名称:smepdll.dll
导出函数申明头文件(部分):
//B ==================================================================
//B 名称:SMEP_Connect
//B 功能:连接服务器
//B
//B 入口:
//B const char *IN_pServerIP, - 服务器IP地址
//B int IN_Port, - 服务器端口
//B int IN_ProxyType, - 代理类型(0-无代理,1-socks4代理,2-socks5代理)
//B char IN_pProxyIP, - 代理服务器IP地址
//B char IN_ProxyPort, - 代理服务器端口
//B BOOL bProxyAuth, - 代理服务器是否验证身份
//B char IN_pProxyUserID, - 代理用户ID
//B char IN_pProxyPassword, - 代理用户密码
//B int IN_ConnectType, - 连接方式:0 MT / 1 MO / 2 查询服务器
//B const char *IN_pECode, - 企业短号
//B const char *IN_pUserName, - 用户名
//B const char *IN_pPassword, - 密码
//B const char *IN_pZoneID, - 所属区号
//B unsigned int IN_OverTime, - 超时的时间(秒)
//B int *OUT_pStatus - 返回连接状态
//B
//B 出口:
//B int >=0 成功,返回的是连接句柄。 OUT_pStatus=0
//B -1 , OUT_pStatus 中放 DLL 定义错误码。 (参见 DllErrCode.h)
//B -2 , OUT_pStatus 中放 服务器返回错误码。
//B (如果连接 MT 服务器, 参见 MtDllErrCode.h)
//B (如果连接 MO 服务器, 参见 MoDllErrCode.h)
//B (如果连接 查询 服务器, 参见 MqDllErrCode.h)
//B ==================================================================
extern "C" DLLSMEPAPI int __cdecl SMEP_Connect(
const char *IN_pServerIP,
int IN_Port,
int IN_ProxyType,
const char* IN_pProxyIP,
int IN_ProxyPort,
int IN_ProxyAuth,
const char* IN_pProxyUserID,
const char* IN_pProxyPassword,
int IN_ConnectType,
const char *IN_pID,
const char *IN_pUserName,
const char *IN_pPassword,
const char *IN_pZoneID,
unsigned int IN_OverTime,
int *OUT_pStatus); //================================================================
对于以上函数我在VB中进行如下声明:
Public Declare Function UF_SMEP_Connect Lib "smepdll.dll" Alias "SMEP_Connect" _
(ByVal IN_pServerIP As String, ByVal IN_Port As Long, ByVal IN_ProxyType As Long _
, ByVal IN_pProxyIP As String, ByVal IN_ProxyPort As String, ByVal bProxyAuth As Long _
, ByVal IN_pProxyUserID As String, ByVal IN_pProxyPassword As String, ByVal IN_ConnectType As Long _
, ByVal IN_pECode As String, ByVal IN_pUserName As String, ByVal IN_pPassword As String _
, ByVal IN_pZoneID As String, ByVal IN_OverTime As Long, ByRef OUT_pStatus As Long) As Long调用时提示“实时错误'49' DLL调用约定错误”请问,此声明有什么问题,是不是cdecl标准的动态连接库不能在VB中使用,谢谢。
解决方案 »
- VB控件提问......
- 多次遇到此问题没解决,今天又遇上了---刚打开工程后,鼠标在窗体上不是箭头而是个十叉,点一下就发送错误报告.
- 请问哪里有XP风格控件的源码?最好是有详细说明的
- 调用ExitWindowsEx(EWX_SHUTDOWN + EWX_POWEROFF, 0)为什么老是注销 而不是关机
- 谁知道友情强档的日历控件是怎么做的,还是有现成的
- 如何实现有时间限制的的计费查询?急!
- 使用VB自带报表的高手,请帮忙解决一个小问题啊!(关于宽度调节的)
- ListView控件
- 我的代码为什么没有响应
- 闲暇之余,进来看看。
- 运行时错误'10' 该数组被固定或临时锁定 怎么解决
- 各位高手,请教一个问题
ATOM ByVal variable As Integer
BOOL ByVal variable As Long
BYTE ByVal variable As Byte
CHAR ByVal variable As Byte
COLORREF ByVal variable As Long
DWORD ByVal variable As Long
HWND, HDC,HMENU,etc.(Windows handles) ByVal variable As Long
INT, UINT ByVal variable As Long
LONG ByVal variable As Long
LPARAM ByVal variable As Long
LPDWORD variable As Long
LPINT, LPUINT variable As Long
LPRECT variable As type
LPSTR, LPCSTR ByVal variable As String
LPVOID variable As Any
LPWORD variable As Integer
LRESULT ByVal variable As Long
NULL As Any or ByVal variable As Long ByVal Nothing or ByVal 0& or vbNullString
SHORT ByVal variable As Integer
VOID Sub procedure
WORD ByVal variable As Integer
WPARAM ByVal variable As Long
cdecl是C语言的调用约定.在这种情况下编译后的dll输出函数名会按照约定所定义的方式有所改变.在别的不支持这约定的语言调用时,就会因为输出函数名改变了,而找不到函数入口点!我的理解就得这么多~呵呵
传送给动态链接库 (DLL)的参数必须符合例程的需要。调用约定要检查个数、类型、参数的顺序等。此错误有以下的原因和解决方法: 程序调用被传递了错误的参数类型的 DLL中的例程时。
确保所有的参数的类型和调用的例程中指定的声明符合。程序调用被传递了错误的参数数目的 DLL中的例程时。
请确保参数数目和所调用的例程的声明符合。程序调用 DLL 的例程,但没有使用 StdCall 调用约定。
如果 DLL 例程需要的是按值参数,那么请在例程的声明中确保这些参数是以 ByVal 进行了声明。对于Windows DLL的Declare 语句包括了 CDecl。
详细信息,可选取有问题的项目,并按下 F1 键。
协议 |参数传递次序|清理堆栈的方法
--------------------------------------------
stdcall |从右到左 |被调用一方 (Win32标准)
--------------------------------------------
cdcel |从右到左 |调用程序
--------------------------------------------
safecall|从右到左 |被调用一方
--------------------------------------------
fastcall|从左到右 |使用寄存器(delphi缺省)
--------------------------------------------
pascal |从左到右 |被调用一方(win3.x缺省)
--------------------------------------------等待新的回复,如果没有,明天结贴!