假设我有一个包含此权限的DLL权限:
//DLL
class foo {
static __declspec int Add(int a, int b)
{
return a+b
}
}
如何调用它调用GetProc地址?即:
HINSTANCE hFoo = LoadLibrary("Foo.dll");
int* proc = NULL;
proc = (int*) GetProcAddress(hFoo, ??????);
//Main Exec linked to dll
您如何使用GetProcAddress获取在dll中创建的类的地址?
答案 0 :(得分:3)
edtheprogrammerguy
是对的。
以下是有关如何正确公开课程的更多信息:
您需要使用属性前缀:
__declspec(dllexport)...
您要公开的所有功能。
请参阅this。
C函数示例:
__declspec(dllexport) int __cdecl Add(int a, int b)
{
return (a + b);
}
可以使用MACROS
简化此操作:所有问题都在此helpful page上解释。
对于C ++类,您只需要为每个类添加前缀(而不是每个方法)
我通常这样做:
注意:以下内容还可确保可移植性......
包含文件:
// my_macros.h
//
// Stuffs required under Windoz to export classes properly
// from the shared library...
// USAGE :
// - Add "-DBUILD_LIB" to the compiler options
//
#ifdef __WIN32__
#ifdef BUILD_LIB
#define LIB_CLASS __declspec(dllexport)
#else
#define LIB_CLASS __declspec(dllimport)
#endif
#else
#define LIB_CLASS // Linux & other Unices : leave it blank !
#endif
用法:
#include "my_macros.h"
class LIB_CLASS MyClass {
}
然后,构建,只需:
-DBUILD_LIB
传递给通常的编译器命令行-shared
传递给通常的链接器命令行答案 1 :(得分:2)
您无法从.dll获取类的地址。如果要使用.dll中的类实例,请使用dllexport / dllimport,它允许您导出类并将其用作本地声明的类。
Microsoft的参考: http://msdn.microsoft.com/en-us/library/81h27t8c(v=vs.80).aspx
答案 2 :(得分:1)
我试图创建显式链接的示例以下是我最终提出的示例,我为之前没有特别提及这一点而道歉。
我们走了:
//DLL
#include "main.h"
#include <windows.h>
#include <stdexcept>
using namespace std;
class FOO{
static __declspec double ADD(double a, double b)
{
return a+b;
}
}
//EXEC
#include <windows.h>
#include <iostream>
#include <stdio.h>
using namespace std;
typedef double (*MYPROC)(double, double);
int main()
{
double d1 = 10;
double d2 = 30;
double retval;
MYPROC procx = NULL;
DWORD err;
HINSTANCE hDll = LoadLibrary("DynamicLinkTester.dll");
if(hDll != NULL)
{
cout << "Success";
procx = (MYPROC) GetProcAddress(hDll, "_ZN7MathDLL5MathX3ADDEdd");
if(NULL != procx )
{
retval= (procx)(d1, d2);
cout << retval;
}
}
}
如果有人想和我做同样的事情:
虽然您无法从dll显式调用类/对象,但您可以调用其方法。