我被赋予了以DLL形式编写现有C ++代码库的包装器的工作。我正在运行的问题是DLL导出名称被破坏了。我可以/应该在将它们传递给GetProcAddress时使用受损的名称吗?或者有更好的办法吗?
编辑:我没提到。我无权访问代码,以便允许我以任何方式修改dll。EDIT2:事实证明我可以访问此DLL的代码(.h和.cpp),但我无法修改所述代码。
答案 0 :(得分:0)
因为你有源代码(不可修改)。
使用DLL源代码文件创建项目。 使用
创建wrapper.cpp / wrapper.h// wrapper.h
#ifndef WRAPPER_H
#define WRAPPER_H
extern "C" {
void wrapper_function1();
// and so on
}
#endif
// wrapper.cpp
#include "wrapper.h"
#include "dll.h"
extern "C" {
void wrapper_function1() { /* code which may call functions from dll.h */ }
// And so on
}
所以你的新DLL没有名称错误。
答案 1 :(得分:0)
我最终解决的问题是我提出的具体问题是以下功能。它在我的情况下工作,因为出口名称只是略有损坏。
static FARPROC getFunctionPointer(HINSTANCE dll, const char *baseName)
{
char buf[256];
FARPROC fp;
sprintf(buf,"%s",baseName);
fp = GetProcAddress(dll,buf);
if (fp == 0)
{
sprintf(buf,"_%s",baseName);
fp = GetProcAddress(dll,buf);
}
if (fp == 0)
{
sprintf(buf,"_%s@4",baseName);
fp = GetProcAddress(dll,buf);
}
if (fp == 0)
{
sprintf(buf,"_%s@8",baseName);
fp = GetProcAddress(dll,buf);
}
if (fp == 0)
{
sprintf(buf,"_%s@0",baseName);
fp = GetProcAddress(dll,buf);
}
if (fp == 0)
{
printf("ERROR: Could not locate function: %s \n", baseName);
}
return fp;
}