dll中使用exe中的变量

◇◆丶佛笑我妖孽 提交于 2020-03-18 18:56:37

注意:输出目录为:Result共享目录

1、exe项目:

// EXE.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

extern"C"__declspec(dllexport) int num(9);

extern"C"__declspec(dllexport) int Sum();

extern"C"__declspec(dllexport) int Sum()
{
    num++;
    return num;
};

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

 

2、DLL.h      //win32 DLL

#pragma once
#ifdef DLLUSEEXE_EXPORTS
#define DLL_API _declspec(dllexport)
#else
#define DLL_API _declspec(dllimport)
#endif

//define DLL_API _declspec(dllexport)  // 报错时可替换上面


class DLL
{
public:
    DLL(void);
    ~DLL(void);
};

extern "C" DLL_API int GetNum();
extern "C" DLL_API int GetSum();

3、DLL.cpp

#include "StdAfx.h"
#include "DLL.h"


DLL::DLL(void)
{
}


DLL::~DLL(void)
{
}


#pragma  comment(lib,"Result\\EXE.lib")

extern"C"__declspec(dllimport) int num;

extern"C"__declspec(dllimport) int Sum();

extern "C" DLL_API int GetNum()
{
    int n = num + 1;
    return n;
}

extern "C" DLL_API int GetSum()
{
    int sum = Sum();
    return sum;
}

4、exe项目

// ExeUseDll.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "..\DLL.h"
#include <iostream>
using namespace std;


#pragma comment(lib,"..\\Result\\DllUseExe.lib")

int _tmain(int argc, _TCHAR* argv[])
{
    cout<<"num = "<<GetNum()<<endl;
    cout<<"sum = "<<GetSum()<<endl;
    int a;
    cin>>a;
    return 0;
}

参考: MFC

1、

在exe的源代码中定义
extern"C" __declspec(dllexport)wchar_t aaa[]=L"asd";
在dll中使用
wchar_t*aaa=(wchar_t*)GetProcAddress(GetModuleHandle(0),"aaa");
MessageBoxW(0,aaa,0,0);
就可以把asd显示出来

2、

在exe中
extern"C" __declspec(dllexport)wchar_t stuID[20]=L"";
……
MultiByteToWideChar(CP_ACP,0,g_ID,-1,stuID,20);//这是为将CString转换成wchar_t

在dll中
//取得主工程的登录ID
wchar_t *stuID = (wchar_t*)GetProcAddress(GetModuleHandle(0),"stuID");
//将wchar_t转换成CString
WideCharToMultiByte(CP_ACP,0,stuID,20,g_stuID.GetBuffer(0),20,NULL,NULL);

3、

假设exe的工程名为MFCTest
exe:
extern"C"__declspec(dllexport)CString aaa("aasd");
构建后在MFCTest.exe所在的目录中会有一个MFCTest.lib导入库,把它加入到dll工程的lib文件列表中
dll:
#pragma comment(lib,"MFCTest.lib")把MFCTest.lib复制到dll工程的目录,如果在工程配置中加入了MFCTest.lib就可以不要这一行
extern"C"__declspec(dllimport)CString aaa;
AfxMessageBox(aaa.GetBuffer(3),0,0);
CDllApp::CDllApp()
{
        AfxMessageBox(aaa.GetBuffer(3),0,0);
        aaa.ReleaseBuffer();
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!