【问题标题】:C++ / Share variable or send data from unmanaged to managed in the same DLLC++ / 共享变量或在同一个 DLL 中将数据从非托管发送到托管
【发布时间】:2014-11-28 08:34:15
【问题描述】:

我有一个混合模式 DLL,其中包含一个非托管部分 (DllMain) 和一个托管 C++ 部分。

我在 DllMain 中计算了一些文件夹,我想在它被调用时将数据共享/发送到托管部分。

我使用 LoadLibrary 从另一个 C++ 程序加载 DLL。

如何从 DllMain 共享数据或将数据发送到托管部分?

我必须分享/发送一些字符*。

谢谢

【问题讨论】:

  • 那是非法的,你可以在 DllMain() 中执行的操作由于加载程序锁而受到严格限制。调用托管代码肯定不行,CLR 不能加载。使用 __declspec(dllexport) 是一种提供本机 C++ 程序可以调用的入口点的简单方法。但是要注意成本,托管代码喜欢抛出异常,而当这种情况发生时,你会像蝙蝠一样盲目。托管 CLR 或使用 [ComVisible] 类是更好的方法。

标签: c++ dll unmanaged managed


【解决方案1】:

您需要从托管 DLL 导出本机函数,本机 DLL 可以调用该函数。 或者,您可以有一个接口(C++ 接口),由CreateThisObject 或类似接口提供支持,它将实例化(接口的)派生类。该接口以及创建函数将由托管 DLL 提供,本地 DLL 将简单地将其用作普通 C++ 类。

下面给出了一种伪代码

// Export function only
EXPORT
int DoSomethingInManagedDLL(args);

// Export hidden class, through an interface
class IDLLHelper
{
   virtual void DoSomething() = 0;
};

EXPORT IDLLHelper* CreateDLLHelper();

// Some class, known only to managed DLL
// This class, as well as above' interface is native

class DLLHelperImpl : public IDLLHelper
{
   void DoSomething()
   {
    // actual code
   }
};

【讨论】:

  • 你好,我不明白如何实现,我有一个公共的 ref 类,这是我的托管代码,这个类应该从 DLLMain 函数中获取值。
  • DllMain 是入口点,本身不是函数。非托管 DLL 无法理解托管内容,因此您需要从托管 DLL 中导出 native 的内容,以便非托管 DLL 可以调用它。
  • 好的,但是当 DllMain 被执行时,clr 没有被加载。仅当我尝试执行使用 clr 标志编译的类时才会加载 clr。
  • 但是当DllMain 正在执行时,为什么需要一些东西呢?为什么不完全加载 DLL?
  • 我想获取当前的 Dll 文件名和文件路径。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 2014-12-01
  • 2013-01-07
  • 1970-01-01
相关资源
最近更新 更多