无法使用LoadLibrary函数加载dll文件

时间:2019-12-30 11:34:36

标签: c++ dll dynamic-linking

因此,我试图制作一个可以动态创建dll文件并将其加载到程序中并对其进行调用的程序。 这是我的代码 createFile:

    void createFile(std::string data, std::string name) {
    std::ofstream file;
    name += ".cpp";
    file.open(name,std::ofstream::out);
    if (file.is_open()) {
        file << data;
        std::cout << "File saved successfully" << std::endl;
        file.close();
    }
    else {
        std::cout << "Error opening file" << std::endl;
        exit(1);
    }
    }

编译:

void compile(std::string name) {
    std::string temp;
    temp = "c++.exe " + name + ".cpp -o dll/" + name + ".dll -shared -fPIC";

    system(temp.c_str());
}

loadFunc:

typedef void (*function)(const char*);
void loadFunc(LPCSTR name, LPCSTR func) {
    HMODULE temp;
    function __cdecl myproc;
    temp = LoadLibraryA(name);
    if (temp != NULL) {
        std::cout << "\nDll is loaded";
        myproc = (function) GetProcAddress(temp, func);
    if (myproc !=NULL)
        {
            std::cout << "\nFunction is loaded\n";
            (myproc)("Somthing here");
        }
        // Free the DLL module.
    FreeLibrary(temp);
    }
}

问题是,当我使用Visual Studio 2019编译dll时,它工作正常,但如果我使用gcc或c ++或g ++编译dll文件,则不会加载该dll。因此,我尝试使用dependency walker来查看两个dll文件(一个由gcc制作,另一个由visual studio制作)之间的区别。我看到文件结构不同。用gcc制作的dll的大小比使用Visual Studio制作的dll大。有人可以帮我吗?

编辑:

因此,在进行了一些反复试验后,我发现只有具有C库的dll文件才能工作。我不知道为什么我曾尝试过使用iostream,但始终无法加载,而另一方面,当我使用stdio.h时,它运行良好。

dllfile.cpp(带有iostream):

#ifdef __cpluplus
extern "C" {
#endif
#include <iostream>

__declspec(dllexport) void print(const char *x){
      std::cout<<x<<std::endl;
}
#ifdef __cplusplus
}
#endif

dllfile.cpp(带有stdio):

#ifdef __cpluplus
extern "C" {
#endif
#include <stdio.h>

__declspec(dllexport) void print(const char *x){
      printf("%s",x);
}
#ifdef __cplusplus
}
#endif

0 个答案:

没有答案