跨dll的c ++类冲突

时间:2016-04-10 16:23:03

标签: c++ dll rtti

我有一个基本抽象类(interface),它在许多DLL之间共享以从中继承。每个DLL都有一个导出的工厂符号,它动态创建一个对象并返回其指针。如果两个不同的DLL具有从同一抽象类继承的具有相同名称的类,会发生什么?

class foo
{
public:
  virtual void func()const=0;
};

Dll1

class bar: public foo
{
public:
  virtual void func()const{
    std::cout << "From Dll1" << std::endl;
  }
};

DLL2

class bar: public foo
{
public:
  virtual void func()const{
    std::cout << "From Dll2" << std::endl;
  }
};

主要

int main()
{
  foo* obj1;
  foo* obj2;
  // load DLLs
  // import factory
  // call factory to initialize objects
  obj1->func(); // output: "From Dll1"
  obj2->func(); // output: "From Dll2"
  return typeid(*obj1) == typeid(*obj2);
}

返回true,意味着obj1obj2都是从同一个类实例化的。以及typeid(*obj1).name()typeid(*obj2).name()返回相同的名称class bar。如果我不允许自己控制DLL,有没有办法可以使用RTTI区分这些对象?类必须有一个机制来为这种情况提供UUID吗?

P.S。 正如IInspectable所说,你可以将对象映射到它的工厂。但是如果界面允许对象进行复制呢? DLL永远不会区分从不同模块返回的对象,因为它不知道工厂。这是我想使用RTTI的主要原因。

1 个答案:

答案 0 :(得分:0)

首先,这种构造只能与here一起使用。如果您使用run time dynamically linking of your DLLs,则链接将识别导入库中的重复符号。因此,我们不再使用标准C ++,而是执行特定行为:

<?php
//give a name attribute for all control in the html page e.g name="twitter" and use the bellow modified code

if($_POST["submit"]) {
$recipient="your@email.address";
$subject="Form to email message";
$sender=$_POST["sender"];
$twittername = $_POST['twitter']
$senderEmail=$_POST["senderEmail"];
$message=$_POST["message"];

$mailBody="Name: $sender \n $twitter \nEmail: $senderEmail\n\n$message";

mail($recipient, $subject, $mailBody, "From: $sender <$senderEmail>");

$thankYou="<p>Thank you! Your message has been sent.</p>";
}

?>

MSVC生成的代码发现两者具有相同的类型。但没有什么能确保这种行为

使用虚函数的指针也很困难,因为你不能取HINSTANCE dll1Handle = LoadLibraryA("Test0410-1DLL1.dll"); HINSTANCE dll2Handle = LoadLibraryA("Test0410-1DLL2.dll"); fct f1, f2; foo *obj1, *obj2; if (dll1Handle == NULL || dll2Handle == NULL) { cout << "Both DLL couldn't be uploaded!" << endl; } else { f1 = (fct)GetProcAddress(dll1Handle, "myfactory"); f2 = (fct)GetProcAddress(dll2Handle, "myfactory"); if (f1 == NULL || f2 == NULL) { cout << "Both factories couldn't be uploaded!" << endl; } else { obj1 = f1(); obj2 = f2(); obj1->func(); obj2->func(); if (typeid(obj1) == typeid(obj2)) cout << "Same type"<<endl; else cout << "Different type" << endl; } } 的地址,你需要obj->func foo::func这是一个相对的地址两个班级都是一样的。

由于你的构造处于load-time dynamic linking的极限并且建立在特定于实现的行为上,我认为安全区分类的最简单方法是在{中提供自制的虚拟类型识别函数{1}}例如,它将组合类和dll名称。