dll入门之精品代码

首先建立“dll.h”,注意其中函数导出方式

文件内容:

#define EXPORT extern "C" _declspec(dllexport) __stdcall

extern "C" _declspec(dllexport) void __stdcall SetString(char*);
extern "C" _declspec(dllexport) void  GetString(char*);
extern "C" _declspec(dllexport) void __stdcall SetData(int);
extern "C" _declspec(dllexport) int dllGlobalVar;

 

建立“dll.cpp”,注意其中函数定义方式

文件内容:

#include <windows.h>
#include <iostream>
using namespace std;
#include "dll.h"

#pragma data_seg("shared")
char buffer[30] = "hello";
int dllGlobalVar = 1;
#pragma data_seg()
#pragma comment(linker, "/SECTION:shared,RWS")

 void __stdcall SetString(char* str) {
  strcpy(buffer, str);
 }

void  GetString(char* str){
     strcpy(str, buffer);
     cout << "hellpo" << endl;
  }

void __stdcall SetData(int i)
{
    dllGlobalVar = i;
}

 

然后在另一个工程中调用它,把前两步生成的DLL文件拷贝到工程目录下,通过depends工具可以查看DLL中的函数名称

调用方式:

#include "windows.h"
#include <iostream>
#include <string>
using namespace std;

#include "dll.h"

typedef void (__stdcall* p_setStringFunc)(char *);
typedef void (* p_getStringFunc)(char *);
typedef void (__stdcall* p_setData)(int);

int _tmain(int argc, _TCHAR* argv[])
{
    int *GlobalVar;
    HINSTANCE hDLL;
    char temp[40];
    hDLL = LoadLibrary("dll_simple_exa.dll");
    if (hDLL != NULL)
    {
        cout << "get DLL success!" << endl;
    }
        p_getStringFunc p_get;
        p_setData p_set;
        p_setStringFunc p_set_str;

        p_get = (p_getStringFunc)GetProcAddress(hDLL, "GetString");
        p_set = (p_setData)GetProcAddress(hDLL, "_SetData@4");
        p_set_str = (p_setStringFunc)GetProcAddress(hDLL, "_SetString@4");

        GlobalVar = (int *)GetProcAddress(hDLL, "dllGlobalVar");
        p_set(4);
        printf("dll data: %d/n", *GlobalVar);

        p_get(temp);
        string str_temp = temp;
        cout << "str_temp: " << str_temp << endl;

        p_set_str("fuok");
        p_get(temp);
        str_temp = temp;
        cout << "str_temp: " << str_temp << endl;
           
    FreeLibrary(hDLL);
    system("pause");
    return 0;
}

 

哈哈,一个下午的艰辛劳动成果呀

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值