Using Run-Time Dynamic Linking(使用运行时动态链接库)

// A simple program that uses LoadLibrary and // GetProcAddress to access myPuts from Myputs.dll. 
#include <windows.h> 
#include <stdio.h> 
 
typedef int (__cdecl *MYPROC)(LPWSTR); 
 
int main( void ) 
{ 
    HINSTANCE hinstLib; 
    MYPROC ProcAdd; 
    BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; 
 
    // Get a handle to the DLL module.
 
    hinstLib = LoadLibrary(TEXT("MyPuts.dll")); 
 
    // If the handle is valid, try to get the function address.
 
    if (hinstLib != NULL) 
    { 
        ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts"); 
 
        // If the function address is valid, call the function.
 
        if (NULL != ProcAdd) 
        {
            fRunTimeLinkSuccess = TRUE;
            (ProcAdd) (L"Message sent to the DLL function\n"); 
        }
        // Free the DLL module.
 
        fFreeResult = FreeLibrary(hinstLib); 
    } 

    // If unable to call the DLL function, use an alternative.
    if (! fRunTimeLinkSuccess) 
        printf("Message printed from executable\n"); 

    return 0;

}
 
 

 
int (__cdecl *MYPROC)(LPWSTR);  

int 表示函数的返回值为 int     若是  TLSConnectToLsServer  函数,则应为  TLS_HANDLE
(__cdecl *MYPROC) 说明这是一个函数指针,调用方式为 __cdecl (还有 _stdcall )
LPWSTR 说明此函数有一个参数,类型为 LPWSTR

(函数指针语法就是要求这样定义的,不是为什么要用,而是必须要用)
 


使用LoadLibrary把dll文件load进内存,使用GetProcAddress得到函数地址就可以使用了


#include <stdio.h>
#include <windows.h>
#include <string>
#include <iostream> 

using namespace std;
void main(void)
{
        typedef int (__stdcall   *PFUNCTION)( int k,int i);
        //声明参数类型,以后会用到PFUNCTION
        HMODULE hLib = ::LoadLibrary("xx.dll");
        if ( NULL == hLib )     
        {
                perror("装载DLL文件错误:");
        }
        else
        {

                PFUNCTION myAddFunction=myAddFunction=(PFUNCTION)::GetProcAddress(hLib,"ConnectEx");//ConnectEx是动态库中的方法
                if ( NULL == myAddFunction)     
                {
                        perror("装载的DLL文件中无对应的函数:");
                }
                else
                {
                        int k=myAddFunction(1,2);
                        cout <<k <<endl;
                }
                ::FreeLibrary(hLib);
        }
}

 

转载于:https://www.cnblogs.com/LeoGodfrey/p/3643897.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值