vc调用dll正常情况下,都是要有h/lib/dll三个档案,但有时并没有lib档,只有dll档和h档,比如用bcb生成的dll,vc不没变法直接用lib档。这时候用动态调用将会更方法。
下面详细讲下如何实现dll动态调用。
bcb先制作测试dll,有4个函数,加、减、乘、除。具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
//--------------------------------------------------------------------------- #ifndef TestH #define TestH //--------------------------------------------------------------------------- #define __TEST_EXPORTS #ifdef __TEST_EXPORTS #define GV_API __declspec(dllexport) #else #define GV_API __declspec(dllimport) #endif //--------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif //--------------------------------------------------------------------------- GV_API float _stdcall Add(float a, float b); GV_API float _stdcall Sub(float a, float b); GV_API float _stdcall Mul(float a, float b); GV_API float _stdcall Div(float a, float b); //--------------------------------------------------------------------------- #ifdef __cplusplus } #endif //--------------------------------------------------------------------------- #endif |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
//--------------------------------------------------------------------------- #pragma hdrstop #include "Test.h" //--------------------------------------------------------------------------- #pragma package(smart_init) //--------------------------------------------------------------------------- GV_API float _stdcall Add(float a, float b) { return a+b; } //--------------------------------------------------------------------------- GV_API float _stdcall Sub(float a, float b) { return a-b; } //--------------------------------------------------------------------------- GV_API float _stdcall Mul(float a, float b) { return a*b; } //--------------------------------------------------------------------------- GV_API float _stdcall Div(float a, float b) { return a/b; } //--------------------------------------------------------------------------- |
编译后有生成Test.dll档,下面将用vc动态直接调用。主要用到函数LoadLibrary加载dll? GetProcAddress获取函数入口地址
具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <Windows.h> typedef float(__stdcall *Fun_fff)(float, float); Fun_fff Add; Fun_fff Sub; Fun_fff Mul; Fun_fff Div; int main() { HINSTANCE Hdl = LoadLibrary("Test.dll"); if (Hdl) { Add = (Fun_fff)GetProcAddress(Hdl, "Add"); Sub = (Fun_fff)GetProcAddress(Hdl, "Sub"); Mul = (Fun_fff)GetProcAddress(Hdl, "Mul"); Div = (Fun_fff)GetProcAddress(Hdl, "Div"); } std::cout <<"相加:"<< Add(2, 3) <<"\n" << "相减:" << Sub(2, 3) << "\n" << "相乘:" << Mul(2, 3) << "\n" << "相除:" << Div(2, 3) << std::endl; system("pause"); return 0; } |
运行结果:

关于dll反编译:
