我正在创建一个应该在运行时使用的 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 = "...";
}
现在这段代码运行良好。问题是在某些函数中,我想通过引用传递整个字符串数组。以前我在这里发现了如何通过引用传递字符串数组,但我认为这只是相应地调整事物的问题:
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
谢谢你的帮助,
莫默吉尔