#include "Calc.h"
#include<iostream>
#include <windows.h>
#include <WINERROR.H.>
typedef void (WINAPI * PCTOR) ();
int main()
{
HMODULE hMod = LoadLibrary (L"Calci.dll");
if (NULL == hMod)
{
printf ("LoadLibrary failed\n");
return 1;
}
CCalc *pCCalc = (CCalc *) malloc (sizeof (CCalc));
if (NULL == pCCalc)
{
printf ("memory allocation failed\n");
return 1;
}
PCTOR pCtor = (PCTOR) GetProcAddress (hMod, "CCalc");//127 error
int err = GetLastError();
if (NULL == pCtor)
{
printf ("GetProcAddress failed\n");
return 1;
}
__asm { MOV ECX, pCCalc };
pCtor ();
return 0;
}
//dll file
#include <tchar.h>
#ifdef CALC_EXPORTS
#define CALC_API __declspec (dllexport)
#else
#define CALC_API __declspec (dllimport)
#endif
#define SOME_INSTN_BUF 260
class CALC_API CCalc
{
private:
char m_szLastUsedFunc[SOME_INSTN_BUF];
public:
CCalc ();
int Add (int i, int j);
int Sub (int i, int j);
TCHAR* GetLastUsedFunc ();
};
问问题
4434 次
3 回答
0
使用 dumpbin.exe 检查 DLL 中导出的确切名称。也许它根本不存在?
如果您有机会使用导入库而不是 LoadLibrary API,那就更好了。
于 2010-06-23T07:13:44.723 回答
0
您正在调用GetProcAddress (hMod, "CCalc")
,但"CCalc"
它不是函数的名称:它是类的名称。
您正在尝试加载CCalc::CCalc
默认构造函数的地址:为此,请使用工具(例如dumpbin
)来发现构造函数的“修饰”名称。
然而,与其尝试动态加载和调用构造函数,实现此功能的更常用方法是在 DLL 中创建静态工厂方法,例如:
class CALC_API CCalc
{
public:
static CCalc* create() { return new CCalc(); }
private:
//doesn't need to be public because users instantiate this class using
//the static create method
CCalc();
public:
virtual int Add (int i, int j);
virtual int Sub (int i, int j);
virtual TCHAR* GetLastUsedFunc ();
virtual ~CCalc() {}
};
然后使用 GetProcAddress 获取静态 CCalc::create 函数的地址,因为它是静态的,您可以在不使用程序集的情况下调用它ECX
。
于 2010-06-23T07:24:03.747 回答
0
您不能将 GetProcAddress 用于类。这不起作用。只有您可以解析其名称的函数是未损坏的“C”函数。
例如:
extern "C" __declspec(dllexport) CCalc *create_calc()
{
return new CCalc;
}
现在,您可以使用它来解决它。
GetProcAddress(halnder,"create_calc");
由于 create_calc 是未损坏的函数。
此外,您必须提供没有实现的抽象 API 类并使 CCalc 继承 ACalc,否则您将获得未解析的符号来编译您的应用程序。因为应用程序不知道实际函数add
和成员函数。remove
class ACalc {
public:
virtual add(int i,int j) = 0;
...
virtaul ~ACalc() {}
};
class CCalc : public ACalc {
public:
virtual add(int i,int j) { ... };
...
};
并且在主程序中
ACalc *ptr= call_for_dll_function
于 2010-06-23T09:11:08.653 回答