我有以下代码:
//mydll.cpp
#include <Windows.h>
#include <io.h>
#define STDOUT_FILEDESC 1
class MYSTDOUT {
bool shouldClose;
bool isBuffered;
public:
MYSTDOUT(bool buf = true, bool cl = true)
: isBuffered(buf),
shouldClose(cl)
{}
~MYSTDOUT() {
if (shouldClose) {
close(STDOUT_FILEDESC);
}
}
};
__declspec(dllexport) void* mydll_init_stdout()
{
static MYSTDOUT outs;
return &outs;
}
//test_dll.cpp
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <io.h>
typedef void* (__cdecl *MYPROC)(void);
int main(void)
{
int fd;
void *pstdout;
MYPROC init_stdout;
HMODULE handle = LoadLibrary(TEXT("mydll.dll"));
init_stdout = (MYPROC)GetProcAddress(handle,"mydll_init_stdout");//NULL
FreeLibrary((HMODULE) handle);
return 0;
}我知道init_stdout is NULL.What可能是个问题?句柄正常(非空)谢谢
发布于 2012-04-21 00:53:47
这是由于名称混乱造成的。
您需要在extern "C"中将导出的函数包装为:
extern "C"
{
__declspec(dllexport) void* mydll_init_stdout()
{
static MYSTDOUT outs;
return &outs;
}
}发布于 2012-04-21 00:52:54
在Dependency Walker或dumpbin /exports中签入,您将看到导出的mydll_init_stdout带有损坏的C++名称。这就是GetProcAddress调用失败的原因。
使用extern "C"停止损坏。
extern "C"
{
__declspec(dllexport) void* mydll_init_stdout()
{
static MYSTDOUT outs;
return &outs;
}
}https://stackoverflow.com/questions/10250323
复制相似问题