现需要用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中使用,谢谢。

解决方案 »

  1.   

    ByVal IN_ProxyPort As String我就看到这个声明错了,应该是LONG(原型是int IN_ProxyPort)
      

  2.   

    注意类型之间的对应关系C 语言数据类型    在VB中的声明 
    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 
      

  3.   

    感谢楼上各位!再次求证,有人在VB中成功调用过cdecl协议的动态连接库吗?
      

  4.   

    http://community.csdn.net/Expert/topic/3174/3174414.xml?temp=.3851435
      

  5.   

    感谢,楼上所说的帖子看了,不知道那个VBAnyCall是什么东东,还是不知道VB能否调用cdecl协议的动态连接库.再次请求指教!
      

  6.   

    也就是VB可以任意呼叫STDCALL或CDECL两种呼叫约定啰!
      

  7.   

    不知道这东西哪里有。我现在已经决定改用VC++开发我所说的程序。不过还是想了解一下关于VB调用连接库的相关内容,有哪位有这方面经验,请指点一二。
      

  8.   

    stdcall也叫pascal调用约定...是标准和调用约定.什么叫:标准...明白吧?
    cdecl是C语言的调用约定.在这种情况下编译后的dll输出函数名会按照约定所定义的方式有所改变.在别的不支持这约定的语言调用时,就会因为输出函数名改变了,而找不到函数入口点!我的理解就得这么多~呵呵
      

  9.   

    DLL 的调用约定错误(错误 49)
       传送给动态链接库 (DLL)的参数必须符合例程的需要。调用约定要检查个数、类型、参数的顺序等。此错误有以下的原因和解决方法: 程序调用被传递了错误的参数类型的 DLL中的例程时。 
    确保所有的参数的类型和调用的例程中指定的声明符合。程序调用被传递了错误的参数数目的 DLL中的例程时。 
    请确保参数数目和所调用的例程的声明符合。程序调用 DLL 的例程,但没有使用 StdCall 调用约定。 
    如果 DLL 例程需要的是按值参数,那么请在例程的声明中确保这些参数是以 ByVal 进行了声明。对于Windows DLL的Declare 语句包括了 CDecl。 
    详细信息,可选取有问题的项目,并按下 F1 键。 
      

  10.   

    感谢楼上各位,我在网上搜索了一下,各种协议的动态连接库主要区别是参数传递次序和清理堆栈的方法不同:--------------------------------------------
    协议    |参数传递次序|清理堆栈的方法
    --------------------------------------------
    stdcall |从右到左    |被调用一方 (Win32标准)
    --------------------------------------------
    cdcel   |从右到左    |调用程序
    --------------------------------------------
    safecall|从右到左    |被调用一方 
    --------------------------------------------
    fastcall|从左到右    |使用寄存器(delphi缺省)
    --------------------------------------------
    pascal  |从左到右    |被调用一方(win3.x缺省)
    --------------------------------------------等待新的回复,如果没有,明天结贴!