【发布时间】:2011-08-28 13:33:46
【问题描述】:
所以我有一个非托管 DLL,它只导出一个 C 风格的工厂方法,该方法返回一个类的新实例(这里简化为看起来很简单)。
你好.h
#if defined(HWLIBRARY_EXPORT) // inside DLL
# define HWAPI __declspec(dllexport)
#else // outside DLL
# define HWAPI __declspec(dllimport)
#endif
struct HelloWorld{
public:
virtual void sayHello() = 0;
virtual void release() = 0;
};
extern "C" HWAPI HelloWorld* GetHW();
你好.cpp
#include "hello.h"
struct HelloWorldImpl : HelloWorld
{
void sayHello(){
int triv;
std::cout<<"Hello World!";
std::cin>>triv;
};
void release(){
this->HelloWorldImpl::~HelloWorldImpl();
};
};
HelloWorld* GetHW(){
HelloWorld* ptr = new HelloWorldImpl();
return ptr;
};
现在,我可以使用 dllimport 来访问 GetHW(),但是有没有办法访问返回的“结构”的成员函数...即 sayHello 和 release?
【问题讨论】:
-
调用实例函数需要 ThisCall 调用约定,而不是由 pinvoke 编组器实现。你的 release() 函数不能工作,它不会释放内存。这样做的唯一明智的方法是用 C++/CLI 语言编写一个 ref 类包装器。
-
+1 用于指出内存泄漏和引用类包装器。
标签: c# visual-studio-2008 visual-c++