使用通过引用传递的字符串数组到运行时加载的 dll 函数

Posted

技术标签:

【中文标题】使用通过引用传递的字符串数组到运行时加载的 dll 函数【英文标题】:Using a passed by reference string array to runtime loaded dll function 【发布时间】:2013-07-25 21:35:48 【问题描述】:

我正在创建一个应该在运行时使用的 DLL 库(即在 Windows 7 中使用 LoadLibrary 加载,使用 FreeLibrary 关闭,并使用 GetProcAddress 提供的函数句柄)。这是使用 Borland C++ Builder 在 C++ 中完成的。 DLL 中的所有函数都应该通过引用接收一些值作为参数(通常是 std::string)。

到目前为止,我使用的方法如下(示例)(总结):

typedef void (*HIS_validity)(string &);

//LoadLibrary

HIS_validity fValidity = (HIS_validity) GetProcAddress(frMain->HIS_DLL.hisLibrary,"checkForValidity");

if (fValidity == NULL) return;

string testeValidade;
fValidity(testeValidade);
const AnsiString testeValidade2(testeValidade.c_str());

if (testeValidade2 != "...")
//etc...

在 DLL 中:

extern "C" void LIBRARY_API checkForValidity(string &str);

void checkForValidity(string &str)

    str = "...";

现在这段代码运行良好。问题是在某些函数中,我想通过引用传递整个字符串数组。以前我发现了如何通过引用here 来传递字符串数组,但我认为这只是相应地调整事物的问题:

typedef void (*HIS_patientData)(string (&)[32]);

HIS_patientData fPatientData = (HIS_patientData) GetProcAddress(frMain->HIS_DLL.hisLibrary,"patientDataFields");

string strDado2[32];
fPatientData(strDado2);
frMain->pluginData.patientData.numProntuario = AnsiString(strDado2[cont1++].c_str());
frMain->pluginData.patientData.pacNome = AnsiString(strDado2[cont1++].c_str());

在 DLL 中:

extern "C" void LIBRARY_API patientDataFields(string (&str)[32]);

void patientDataFields(string (&str)[32])

    str[0] = "One";
    str[1] = "Two";
    str[2] = "Three";
    //....

但是这里出现了问题。当我编译和运行我的应用程序时,总是会出现同样的问题:如果我在 DLL 中的函数只有两个归因于 'str[]' 的数据,则代码会在 'fPatientData(strDado2);' 之后出现但是当我阅读strDado2[0]的内容时,它的值是str[1],而strDado2[1]里面有NULL!另一方面,如果我在我的 DLL 函数中为“str[]”添加三个或更多属性,软件总是在涉及“fPatientData(strDado2);”时崩溃。弹出一个提示“访问冲突......在模块 libstdc++-6.dll 中”。

我不知道问题是什么:T

感谢您的帮助,

莫默吉尔

【问题讨论】:

请注意:当您在原型中指定调用约定时(这对库来说是一件好事),“建议”在函数定义中也指定它。 好吧,假设LIBRARY_API 是一个调用约定... 还有 2 个注意事项:始终使用英文编码是一种网络礼仪,尤其是在发布示例代码时,因为它对大多数人来说更容易阅读。而且几乎不能使用using namespace std @yourmt: 关于英文,所有相关部分都是英文o.O关于“使用命名空间std”,我只在代码中设置了太多对std::的调用时使用它;放 std:: 太多次是很无聊...关于 LIBRARY_API: #if defined(_WIN32) #define LIBRARY_API __declspec(dllexport) #else #define LIBRARY_API #endif 【参考方案1】:

好的,看来我找到了所有此类问题的答案......也就是说,我试图在“extern“C””函数中返回一个 C++ 类(std::string)。只是让它返回一个标准的 const char* ,一切都开始运行得很好。

感谢贡献者,

莫默吉尔

【讨论】:

以上是关于使用通过引用传递的字符串数组到运行时加载的 dll 函数的主要内容,如果未能解决你的问题,请参考以下文章

在运行时加载 C++ DLL

unity3d导入c ++ dll,用于通过引用方法传递

如何安全地将字符串引用从 c# 传递到 c++?

C ++通过引用dll中的函数传递std :: string

DLL 引用未复制到项目 bin

C,如何将多维数组传递给 CLR/类库项目中的函数