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

时间:2013-07-25 21:35:48

标签: c++ arrays plugins dll

我正在创建一个应该在运行时使用的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

感谢您的帮助,

Momergil

1 个答案:

答案 0 :(得分:0)

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

感谢贡献者,

Momergil