• dll中使用exe中的变量


    注意:输出目录为: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();
    }

  • 相关阅读:
    ActiveMq C#客户端 消息队列的使用(存和取)
    .NET中RabbitMQ的使用
    如何写入和读取从 Microsoft 消息队列在 Visual C#
    完整的站内搜索Demo(Lucene.Net+盘古分词)
    最大熵,熵,MLE的解释,还行
    JavaScript是如何工作的: CSS 和 JS 动画底层原理及如何优化它们的性能
    Fundebug发布Vue插件,简化BUG监控接入代码
    Spring Boot统一异常处理实践
    预计2019年发布的Vue3.0到底有什么不一样的地方?
    开源前端脚本错误监控及跟踪解决项目BadJS试用
  • 原文地址:https://www.cnblogs.com/shenchao/p/3224669.html
Copyright © 2020-2023  润新知