可是这样不能调用啊?
a("a string", 1);  // wrong.

解决方案 »

  1.   

    dim a as long
    a = GetProcAddress(数字,字符) 
      

  2.   

    问题是:从 GetProcAddress 返回的实际上是一个函数地址,我想调用这个函数,怎样调用?
      

  3.   

    to ab:好久不见了,最近在忙些什么?:)怎么到vb版块来了??dim result,hmodule as long
    sub procname()
    ...
    end sub
    ....
    result=getprocaddress(hmodule,procname)
      

  4.   

    ffff(char *s1,int n1)==
    private sub fff(byval s1 as string,byval n1 as integer) as Boolean
    ...
    end sub (是不是sub???是fuction??算拉,反正八九不离十:)
      

  5.   

    看样子还是我没说明白,举例说,在 C 里面可以这样写:
        typedef int (*FPFUNC)(char *s, int n);
        HINSTANCE hDLL = LoadLibrary("c:\my.dll");
        FPFUNC func = (FPFUNC)GetProcAddress(hDLL, "funcname");
        func("abcdefg", 123);
    这一段如何改成 VB 代码?或者 VB 里面有更方便的方法?还有,funcname 这个函数的调用协议不一定是 stdcall,也可能是 cdecl,要怎么改呢?
      

  6.   

    'Create a new project and add this code to Form1
    Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
    Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
    Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
    Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long
    Private Sub Form_Load()
        On Error Resume Next
        'We're going to call an API-function, without declaring it!
        Dim lb As Long, pa As Long
        'map 'user32' into the address space of the calling process.
        lb = LoadLibrary("user32")
        'retrieve the address of 'SetWindowTextA'
        pa = GetProcAddress(lb, "SetWindowTextA")
        'Call the SetWindowTextA-function
        CallWindowProc pa, Me.hWnd, "Hello !", ByVal 0&, ByVal 0&
        'unmap the library's address
        FreeLibrary lb
    End Sub
      

  7.   

    'Create a new project and add this code to Form1
    Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
    Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
    Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
    Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long
    Private Sub Form_Load()
        On Error Resume Next
        'We're going to call an API-function, without declaring it!
        Dim lb As Long, pa As Long
        'map 'user32' into the address space of the calling process.
        lb = LoadLibrary("user32")
        'retrieve the address of 'SetWindowTextA'
        pa = GetProcAddress(lb, "SetWindowTextA")
        'Call the SetWindowTextA-function
        CallWindowProc pa, Me.hWnd, "Hello !", ByVal 0&, ByVal 0&
        'unmap the library's address
        FreeLibrary lb
    End Sub
      

  8.   

    我是 VB 超菜鸟,只想把下面的 C 代码改成同等功能的 VB 代码:
        typedef int (*FPFUNC)(char *s, int n);
        HINSTANCE hDLL = LoadLibrary("c:\my.dll");
        FPFUNC func = (FPFUNC)GetProcAddress(hDLL, "funcname");
        func("abcdefg", 123);
      

  9.   

    '声明
    Declare Function funcname Lib "c:\my.dll" (ByVal s1 as string,ByVal n1 as integer) As Booleam
    '使用
    dim a as booleam
    a=funcname("abcdef",123)
    '看是不是这个意思啦
    '声明函数FUNCNAME在"C:\MY.DLL"中,该函数有两个参数,第一个为字符串,第二个为短整型数值
    '调用该函数返回一个逻辑值 1 或 0 即vb中的True 和 False.
    '首先在vb中声明函数的位置和参数及返回值.并将它的调用结果返回给a.如果在窗体中,声明前加
    'Private 限制作用域.
    如果不对,请再将题意讲清楚些.
      

  10.   

    谢谢feiying_bao,差不多了,可是下面这个该怎么声明呢?问题大概是调用协议。
    typedef int (PASCAL *funcname)(LPSTR s1, LPSTR s2, int n1, DWORD dw1, int n2, LPCSTR s3, int n4);
      

  11.   

    可以了,是 dword 应该写成 long.