是否可以编写一个C .dll库来导出在命名空间和类中编写的方法

Is it possible to write a C++ .dll library to export methods which is written within namespace and class?

本文关键字:命名空间 方法 dll 是否 一个      更新时间:2023-10-16

我是新手到C dll概念,只想知道,是否可以编写一个C .dll库来导出命名空间和类中写入的方法?

我尝试过的...

/*JNLib.h Header File*/
#ifndef __JNLIB_H__
#define __JNLIB_H__
#include <string>
#include <vector>
using namespace std;
    namespace JNLib
    {
        class __declspec(dllexport) JNLibClass
        {
        public:
                void split_string();
        };
    }
#endif

和内部.cpp文件

/*JNLib.cpp File*/
#include "stdafx.h"
#include "JNLib.h"
    namespace JNLib
    {
        void JNLibClass::split_string()
        {
            cout<<"Library called"<<std::endl;
        }
    }

现在,我能够编译该项目并成功获取.dll文件。在另一个项目中,我能够通过使用LoadLibrary()方法成功加载库(.dll)文件,但GetProcAddress方法每次都会返回null。我编写的代码是

typedef void (CALLBACK  *f_funci)();
HINSTANCE dllinstance = LoadLibrary(L"..\myLIB\JNLib.dll");
f_funci funci = (f_funci)GetProcAddress(dllinstance, "split_string");

请让我知道我做错了什么。

库中没有称为 split_string的符号 - 名称已被弄糊。

您可以使用DLL上的dumpbin工具来查看导出了哪些符号。另外,您可以将要导出的命名空间/类并转移到extern "C"块(该块)中(停止名称Mangling)。

可以从dll中导出其名称空间中的方法。


首先,使用命名空间定义方法,如@OMGTechy上面写的那样 - 添加extern "C"装饰:

namespace MyNameSpace{
    extern "C" void foo();
}

第二,编辑您的项目def文件以指定您的命名空间映射:

LIBRARY MyDllName
EXPORTS
    MyNameSpace::foo=foo

现在,加载方法指定您的命名空间:

typedef void(*PFN_MYFUNC)();
HINSTANCE  hLib = ::LoadLibrary("MyDllName");
PFN_MYFUNC pfn  = (PFN_MYFUNC)::GetProcAddress( hLib, "MyNameSpace::foo");