我在VC中定义一个函数,生成DLL(API),函数内容如下
PackRecord ( char *s, ... )
{
va_list ap;
int t, x;
va_start ( ap, s );
while ( ( t = va_arg ( ap, int ) ) )
{
x = t;
}
va_end ( ap );
return 1;
}
生成DLL后为FileReadWrite.dll.拷贝到系统system32下,我在vb中调用,代码如下:
Private Declare Function PackRecord Lib "FileReadWrite" (strFile As String, ParamArray Items()) As Integer
Private Sub Form_Load()
    Dim n As Integer
    n = PackRecord("1.dat", 121, 2334, 5567)
End Sub
经调试,发现传到C中的参数全部不对。请指教。

解决方案 »

  1.   

    Private Declare Function PackRecord Lib "FileReadWrite" (strFile As String, ParamArray Items()) As IntegerstrFile As String要改成ByVal strFile As String
    至于可选参数在DLL中的调用。我也没接触过。
      

  2.   


    生命就是因为奋斗而变得美丽
      人家散分,我就接 ......    不懂的问题,我就进来学习,UP接分 ......      知道一点的问题,我就给个意见,顺便UP接分 ......        我懂的问题,那就赶紧回答,也就是进来抢分的 ......
      

  3.   

    C/C++                Visual BasicATOM                 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,...   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 
    NULL                 ByVal variable As Long
    SHORT                ByVal variable As Integer
    WORD                 ByVal variable As Integer
    WPARAM               ByVal variable As Long
      

  4.   

    Private Declare Function PackRecord Lib "FileReadWrite" (ParamArray Items()) As Integer
      

  5.   

    用参数数组传进来的是一个变体数值,并不符合c中所规定的参数列表的格式。以下是一种解决方法——>>>>>>>VB中:
    Private Sub Form_Load()
        Dim oAnyCall As New CVBAnyCall
        Dim n As Long
        
        oAnyCall.IsStandardCall = False
        n = oAnyCall.CallApiByName("FileReadWrite.dll", "PackRecord", _
                        VarPtr(StrConv("1.dat", vbFromUnicode)), 1, 2, 3, 13, 0)
        Debug.Print n
    End Sub>>>>>>>VC中:
    int PackRecord ( char*s , ...){
    va_list ap;
    int t, x;
    va_start ( ap, s );
    while ( ( t = va_arg ( ap, int ) ) )
    {
    x = t;
    }
    va_end ( ap );
    return 1;
    }
    在这种情况下,是否在Dll中的函数PackRecord前加上__stdcall 修饰符并不重要,因为在编译的时候编译器并不知道实际参数的个数,所以在最后ret的时候也就不会恢复调用堆栈,也就是说擦pp的工作得靠调用者来做了,即按照__cdecl方式来调用你的函数……VBAnyCall类的代码与信息请看这里:
    http://community.csdn.net/Expert/TopicView.asp?id=2980550
      

  6.   

    "ParamArray"表示参数数组,规则如下:1 一个过程只能有一个参数数组,而且必在其他参数后面;
    2 它的前面明确有ByVal;
    3 它必是一维数组,且每个元素必是同一类型;
    4 它声明之后就为可选参数,缺省值为每种类型的"Empty"值。
      

  7.   

    Private Declare Function PackRecord Lib "FileReadWrite" (Byval strFile As Long, ParamArray Items()) As Long
    程序怎么知道你所要使用的文件“1.dat”的路径?
      

  8.   

    有个不成熟的建议
    typedef struct _paramElem
    { char paramType ;
      void *hParam;
      int paramCb;
    }paramElem;
    PackRecord ( char *s,paramElem p[],int elemNum );或许这样可以,让个位见笑了.