流沙团
测试动态链接库 DLL文件
2017-11-12 流沙团


1 \ 生成dll文件






myDll.h













// MyDll.h: interface for the MyDll class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_MYDLL_H__E6C7930C_99AF_46AF_B08E_42EDB1680395__INCLUDED_)
#define AFX_MYDLL_H__E6C7930C_99AF_46AF_B08E_42EDB1680395__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


extern "C" __declspec(dllexport) __stdcall int Plus(int x,int y);
extern "C" __declspec(dllexport) __stdcall int Sub(int x,int y);
extern "C" __declspec(dllexport) __stdcall int Mul(int x,int y);
extern "C" __declspec(dllexport) __stdcall int Div(int x,int y);



#endif // !defined(AFX_MYDLL_H__E6C7930C_99AF_46AF_B08E_42EDB1680395__INCLUDED_)










myDll.cpp










// MyDll.cpp: implementation of the MyDll class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "MyDll.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

int __stdcall Plus(int x,int y)
{
return x+y;
}


int __stdcall Sub(int x,int y)
{
return x-y;
}


int __stdcall Mul(int x,int y)
{
return x*y;
}


int __stdcall Div(int x,int y)
{
return x/y;
}


















2\ 使用dll动态链接库







两种使用方法



a - 显示调用,  __declspec(dllimport)



b- 隐示调用,  函数指针的方法







测试代码










// 20171111_01.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <Windows.h>

#pragma comment(lib,"TestDll.lib")

/*
extern "C" __declspec(dllimport) __stdcall Plus(int x,int y);
extern "C" __declspec(dllimport) __stdcall Sub(int x,int y);
extern "C" __declspec(dllimport) __stdcall Mul(int x,int y);
extern "C" __declspec(dllimport) __stdcall Div(int x,int y);
*/

typedef int (__stdcall *lpPlus) (int x,int y);
typedef int (__stdcall *lpSub) (int x,int y);
typedef int (__stdcall *lpMul) (int x,int y);
typedef int (__stdcall *lpDiv) (int x,int y);


int main(int argc, char* argv[])
{
lpPlus myPlus;
lpSub mySub;
lpMul myMul;
lpDiv myDiv;

HINSTANCE hModule = LoadLibrary("TestDll.dll");

myPlus = (lpPlus)GetProcAddress(hModule,"_Plus@8");
mySub = (lpPlus)GetProcAddress(hModule,"_Sub@8");
myMul = (lpPlus)GetProcAddress(hModule,"_Mul@8");
myDiv = (lpPlus)GetProcAddress(hModule,"_Div@8");

//printf("Hello World!\n");
int x= mySub(101,11);
printf("%d \n",x);
FreeLibrary(hModule);
return 0;
}


















按照序号导入的代码案例










//隐藏了函数名称,在应用程序中使用序号来导入函数:

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

int main()
{
  typedef int (* AddFunc)(int, int);
  HMODULE hModule = LoadLibrary("dll.dll");
  AddFunc add = (AddFunc)GetProcAddress(hModule, MAKEINTRESOURCE(1)); //注意这里序号的指定方式
  printf("%d\n", add(1, 2));
  return 0;
}








发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容