獲得DLL函數的地址,我創建了一個DLL與VS C++(當然作爲一個dll項目)與頭文件的下面的代碼:不能GetProcAddress的
#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。我認爲這與名稱修改有關,並且在導出dll頭部中的類時添加了extern "C"
,但沒有任何更改。順便說一下,我用dll export viewer查看類的導出函數,並且整個類都正確導出。 有什麼幫助嗎?
UPDATE
dll的頭文件中有錯誤。我不應該在課前使用extern "C" __declspec(dllexport)
,因爲那樣課程根本不會被導出。如果我使用class __declspec(dllexport) CExportCoordinator
,那麼該類將正確導出,但無論如何,我無法獲得NULL以外的函數地址。