在RAD Studio中调用命名空间下的DLL函数

在RAD Studio中调用命名空间下的DLL函数,dll,c++builder,dllimport,Dll,C++builder,Dllimport,我不熟悉使用RAD Studio,因为我现在必须在这个项目中使用它。我要做的是调用DLL文件中定义的函数,这些文件是我在RAD StudioC++项目中在VisualStudio中生成的。p> 遵循下面这个问题的建议 我已经使用VisualStudio生成的C++ DLL文件转换为支持RADStudio的文件,使用它们的命令: mkexp pub-sub-sample.a pub-sub-sample.dll 我可以验证我的函数是否已在执行命令转储时导出 Turbo Dump Version

我不熟悉使用RAD Studio,因为我现在必须在这个项目中使用它。我要做的是调用DLL文件中定义的函数,这些文件是我在RAD StudioC++项目中在VisualStudio中生成的。p> 遵循下面这个问题的建议 我已经使用VisualStudio生成的C++ DLL文件转换为支持RADStudio的文件,使用它们的命令:

mkexp pub-sub-sample.a pub-sub-sample.dll
我可以验证我的函数是否已在执行命令转储时导出

Turbo Dump  Version 6.5.4.0 Copyright (c) 1988-2016 Embarcadero Technologies, Inc.
                Display of File pub-sub-sample.dll

EXPORT ord:0001='?DisconnectCallback@PubSub@samples@awsiotsdk@@IEAA?AW4ResponseCode@3@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$shared_ptr@VDisconnectCallbackContextData@awsiotsdk@@@6@@Z'
EXPORT ord:0002='?GetCurrentPath@ConfigCommon@awsiotsdk@@SA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ'
EXPORT ord:0003='?InitializeCommon@ConfigCommon@awsiotsdk@@SA?AW4ResponseCode@2@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z'
EXPORT ord:0004='?InitializeTLS@PubSub@samples@awsiotsdk@@IEAA?AW4ResponseCode@3@XZ'
EXPORT ord:0005='?LogParseError@ConfigCommon@awsiotsdk@@KAXAEBW4ResponseCode@2@AEBV?$GenericDocument@U?$UTF8@D@rapidjson@@V?$MemoryPoolAllocator@VCrtAllocator@rapidjson@@@2@VCrtAllocator@2@@rapidjson@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z'
EXPORT ord:0006='?ReconnectCallback@PubSub@samples@awsiotsdk@@IEAA?AW4ResponseCode@3@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$shared_ptr@VReconnectCallbackContextData@awsiotsdk@@@6@W443@@Z'
EXPORT ord:0007='?ResubscribeCallback@PubSub@samples@awsiotsdk@@IEAA?AW4ResponseCode@3@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$shared_ptr@VResubscribeCallbackContextData@awsiotsdk@@@6@W443@@Z'
EXPORT ord:0008='?RunPublish@PubSub@samples@awsiotsdk@@IEAA?AW4ResponseCode@3@H@Z'
EXPORT ord:0009='?RunSample@PubSub@samples@awsiotsdk@@QEAA?AW4ResponseCode@3@XZ'
EXPORT ord:0010='?Subscribe@PubSub@samples@awsiotsdk@@IEAA?AW4ResponseCode@3@XZ'
EXPORT ord:0011='?SubscribeCallback@PubSub@samples@awsiotsdk@@IEAA?AW4ResponseCode@3@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0V?$shared_ptr@VSubscriptionHandlerContextData@mqtt@awsiotsdk@@@6@@Z'
EXPORT ord:0012='?Unsubscribe@PubSub@samples@awsiotsdk@@IEAA?AW4ResponseCode@3@XZ'
而且它是在visual studio项目下构建和运行的,在该项目中,我可以从生成的DLL文件中调用RunSample()函数

#include <iostream>
#include "PubSub.hpp"

int main()
{
    awsiotsdk::samples::PubSub object1;
    object1.RunSample();
}
#包括
#包括“PubSub.hpp”
int main()
{
awsiotsdk::samples::PubSub object1;
object1.RunSample();
}

我的问题是,如何将上面的示例代码移植到RAD StudioC++项目中运行?我尝试在awsiotsdk::samples::PubSub object1前面使用extern“C”uu declspec(dllimport),但它不起作用。

对于编译器之间的互操作性,不应该使用类、名称空间等。不可移植的东西,不同的供应商不会以相同的方式对名称进行修改,等等。您应该只导出与C兼容的内容。因此,这意味着重新编写DLL以使用简单的名称、使用
extern“C”
、使用POD类型将内容展平,不幸的是,我没有选择,因为它是亚马逊AWS C++ SDK,我已经生成了一个DLL,我需要在RAD Studio C++ C++项目中运行。您必须将所需的SDK操作包装在Visual Studio DLL中,该DLL导出C兼容接口供C++Builder使用。除非你可以直接在C++ Builder中而不是在VisualStudio中重新编译SDK源代码,也就是说,整个Amazon AWS C++ SDK源文件都是在VisuxStudio中编写的,它使用完全的类和命名空间。我不喜欢它在RAD studio中作为DLL成功构建的机会。那么,用C兼容的导出将它包装到Visual studio DLL中是唯一可行的选择。