我有一个基本抽象类(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
,意味着obj1
和obj2
都是从同一个类实例化的。以及typeid(*obj1).name()
和typeid(*obj2).name()
返回相同的名称class bar
。如果我不允许自己控制DLL,有没有办法可以使用RTTI
区分这些对象?类必须有一个机制来为这种情况提供UUID
吗?
P.S。
正如IInspectable所说,你可以将对象映射到它的工厂。但是如果界面允许对象进行复制呢? DLL永远不会区分从不同模块返回的对象,因为它不知道工厂。这是我想使用RTTI
的主要原因。
答案 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名称。