не может получить адрес функции dll с помощью GetProcAddress - PullRequest
0 голосов
/ 18 августа 2010

Я создал dll с VS C ++ (конечно, как проект dll) со следующим кодом файла заголовка:

#pragma once
#include <iostream>
#include "..\..\profiles/ProfileInterface.h"

using namespace std;

extern "C" __declspec(dllexport) class CExportCoordinator: public CProfileInterface
{
public:
    CExportCoordinator(void);
    virtual ~CExportCoordinator(void);

    CProfileInterface* Create();
    void Initialize();
    void Start();   
};

Вот файл .cpp библиотеки dll:

#include "StdAfx.h"
#include "ExportCoordinator.h"

CExportCoordinator::CExportCoordinator(void)
{
}

CExportCoordinator::~CExportCoordinator(void)
{
}

CProfileInterface* CExportCoordinator::Create(){

    cout << "ExportCoordinator3 created..." << endl;
    return new CExportCoordinator();
}

void CExportCoordinator::Initialize(){

        cout << "ExportCoordinator3 initialized..." << endl;
}

void CExportCoordinator::Start(){

    cout << "ExportCoordinator3 started..." << endl;
}

Я экспортировал весь класс CExportCoordinator, потому что мне нужно использовать все три метода, которые он предлагает.Ниже приведен код основного приложения, загружающего вышеупомянутую dll на лету.

    typedef CProfileInterface* (WINAPI*Create)();

    int _tmain(int argc, _TCHAR* argv[])

{    
    HMODULE hLib = LoadLibrary(name);


    if(hLib==NULL) {
        cout << "Unable to load library!" << endl;         
        return NULL;
    }
    char mod[MAXMODULE];

    GetModuleFileName(hLib, (LPTSTR)mod, MAXMODULE);
    cout << "Library loaded: " << mod << endl;   

    Create procAdd = (Create) GetProcAddress(hLib,"Create");

    if (!procAdd){
        cout << "function pointer not loaded";
    }
    return;
}

На выходе я получаю, что загружена правильная библиотека, но указатель на функцию procAdd равен NULLЯ думал, что это как-то связано с искажением имени и добавил extern "C" при экспорте класса в заголовок dll, но ничего не изменилось.Кстати, я использовал dll export viewer для просмотра экспортированных функций класса, и весь класс экспортируется правильно.Любая помощь?

ОБНОВЛЕНИЕ
есть ошибка в файле заголовка DLL.Я не должен использовать extern "C" __declspec(dllexport) перед классом, потому что тогда класс вообще не будет экспортироваться.Если я использую class __declspec(dllexport) CExportCoordinator, тогда класс экспортируется правильно, но в любом случае я не могу получить адрес функции, отличный от NULL.

Ответы [ 2 ]

1 голос
/ 18 августа 2010
extern "C" __declspec(dllexport) class CExportCoordinator: public CProfileInterface 
{ 

Это чепуха.Класс не может быть «внешним C»

... inside the class ...
    CProfileInterface* Create();  

Это создает функцию-член класса, что, вероятно, не то, что вы хотите.Во-первых, он будет искажен в DLL, во-вторых, он не будет вызываться без указателя this.Возможно, вам нужно это объявление:

extern "C" __declspec(dllexport) CProfileInterface* Create();  

и реализация:

extern "C" __declspec(dllexport) CProfileInterface* Create(){
    cout << "ExportCoordinator3 created..." << endl;     
    return new CExportCoordinator();     
}   
1 голос
/ 18 августа 2010

Мне кажется, что вы должны объявить метод Create как метод static и экспортировать только этот метод. Если у вас останется NULL в GetProcAddress, вам следует изучить экспорт вашей DLL с учетом Dependency Walker (см. http://www.dependencywalker.com/) и изменить имя функции «Создать» на что-то вроде «_Create» или « _Create @ 2" .

...