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
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); } }