这次我正在搞乱动态dll加载。在处理了大量的链接器错误后,我终于得到了编译的东西,但是我的dll文件没有加载自己。我按照这里讨论的方式或多或少做了所有事情:http://www.programmingforums.org/thread21690.html 通常,我想创建一个在我准备和加载的dll中定义的类的对象。
使用dll的函数看起来像这样:
void CData::OnButton2()
{
HINSTANCE hDLL=NULL; // Handle to DLL
typedef void (*GETDLLOBJECT)(IProcess**);
TRACE(_T("button2\n"));
hDLL = AfxLoadLibrary(_T("ImagePerspectiveComputation.dll"));
if (hDLL != NULL)
{
TRACE(_T("library loaded\n"));
GETDLLOBJECT StworzObjekt = (GETDLLOBJECT)GetProcAddress(hDLL,"CreateTheObject");
if (!StworzObjekt)
{
// handle the error
//same irrelevant code here
}
else
{
//same irrelevant code here too
}
}else
TRACE(_T("failed loading\n"));
}
我正在声明要导出的类的文件的.h文件:
#include <atlimage.h>
#include <afx.h>
#ifdef DLLMESSAGE
#define PORT __declspec(dllimport)
#else
#define PORT __declspec(dllexport)
#endif
using namespace std;
class PORT IProcess
{
public:
IProcess(void);
IProcess(CString fotka);
virtual ~IProcess(void);
virtual void SetImagePath(CString fotka);
virtual CImage GetCorners(int* pointx,int* pointy,int* pointnumber,int blocksize,double ksize,int aperturesize);
virtual void GetTransformMatrix(int pointnum, CPoint *input,CPoint *desired,double** result);
private:
CString obraz;
};
extern "C" PORT void CreateTheObject(IProcess **objekt);
extern "C" PORT IProcess* CreateTheObjectParam(CString fotka);
没有错误或警告,但是我在输出部分得到了这个:
bylo!
BUTTON2
'PhotoInterface.exe':已加载'C:\ Users \ BART \ Documents \ Visual Studio 2010 \ Projects \ PhotoInterface1 \ PhotoInterface \ ImagePerspectiveComputation.dll',已加载符号。
'PhotoInterface.exe':已卸载'C:\ Users \ BART \ Documents \ Visual Studio 2010 \ Projects \ PhotoInterface1 \ PhotoInterface \ ImagePerspectiveComputation.dll'
加载失败
wszedl
这表明dll被加载和卸载,给我的hDLL等于NULL。 我的链接有问题吗?或者是因为我对dll的主要类没有做任何事情? (从CWinApp派生的那个)。除了一些可选的初始化代码(我忽略了)之外,我还没有看到任何关于用它做某事的必要性的文章。
我很感激任何建议。
编辑: 爱德华克莱门斯有很好的建议。起初我得到了错误126,这对我来说非常奇怪,因为拼写错误的dll名称不会给我加载 - 卸载消息。我确实运行了依赖walker并发现了一些问题:运行时缺少opencv dll(通过将它们放在同一个文件夹中暂时修复)以及缺少msvcp110d.dll和msvcr110d.dll
的更具挑战性