Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
LoadLibrary返回的是在内存的首地址吗。?我想释放一个资源文件里的DLL,从资源文件里读取DLL到一个字节数组,能不能直接在内存里执行API.不想保存到硬盘让人发现。

解决方案 »

  1.   

    你看看我的博客,可能对你有帮助
    http://blog.csdn.net/SupermanKing/archive/2008/09/28/2992218.aspx
      

  2.   

    不是,返回的是 Handle
    需要用 GetModuleAddress 获得地址。
      

  3.   

    'Example Name:Call Procedure
    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
        'KPD-Team 1999
        'URL: http://www.allapi.net/
        'E-Mail: [email protected]
        '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
      

  4.   


     Handle 是 LONG是什么?
      

  5.   

    可以动态调用API,这里就有一个(超级神豆的):http://topic.csdn.net/u/20110329/10/78f7baa9-d526-4a6f-8e23-6141d9bb76d3.html
      

  6.   

    LoadLibrary 返回的就是地址,win32api中没有GetModuleAddress这个东西
      

  7.   

    Public Type MPNumber
     nSize As Long
     lpData As Long
    End TypePublic Type MPBarrett
     nSize As Long
     lpModl As Long
     lpMu As Long
    End TypePublic Declare Function RSAEncrypt Lib "beecrypt.dll" Alias "_rsapub@16" (n As MPBarrett, e As MPNumber, tData As MPNumber, tDataRet As MPNumber) As Long这个DLL都是传的自定义结构。
      

  8.   



    pe文件必须初始化后才能正确调用,否则无法正确执行的;但目前除了纯手动实现加载dll外,没有系统方法提供这个方便,如果想实现纯动态加载dll,去看雪找找这样的代码吧,不过意义不是很大
      

  9.   

    不知道是不是我理解错了,估计你的情况是这样:
    你有一个支持 API 的 DLL 文件,然后将其放到VB的二进制资源里。
    你想在不用将 DLL 文件数据转储到磁盘的情况下,想通过内存数组的方式
    读出 DLL 文件数据,并想直接以这个字节数组为契机,执行里面的函数。
    如果是这样,据我所知,应该没有直接的API支持(可能是我的功力不够也不一定)。
    但以我了解的API函数来说,应该是没有的。如果要做这样的事情,可以考虑从另外
    一个方向入手,就是虚拟文件路径,比如你讲你内存的数据通过一个驱动接口虚拟成
    一个文件地址,让LoadLibrary去读这个虚拟路径,然后驱动程序返回你给定的内容
    给他,这样一来问题就解决了,不过这种方向要涉及驱动和相关的API开发。不是单纯
    用 VB 就能实现的功能。
      

  10.   

    楼主对动态链接库的运行机制还不太清楚。当然,也许是想创新!
    推荐楼主看看下面文章:http://topic.csdn.net/u/20110228/13/7f6ec8f7-0ce3-4bf2-9abe-708171191a9c.html