Функция не работает в DLL
У меня есть такая структура
#define MAX_NAME_LENGTH 40 typedef struct _tagMYPERSON { WCHAR FName[MAX_NAME_LENGTH]; WCHAR LName[MAX_NAME_LENGTH]; int Age; double Salary; }MYPERSON;
тогда у меня есть функция в DLL, как это
extern "C" MARSHALDLL_API void _stdcall ModifyPersonStructArray(int nCount, MYPERSON * pPersonArr) { for ( int nI = 0; nI < nCount; nI++ ) { wcscat_s(pPersonArr[nI].FName, MAX_NAME_LENGTH, L"-Modified"); wcscat_s(pPersonArr[nI].LName, MAX_NAME_LENGTH, L"-Modified"); pPersonArr[nI].Age = pPersonArr[nI].Age+ 5; pPersonArr[nI].Salary = pPersonArr[nI].Salary + 1000 ; } }
и вот как я это называю.
int nCount = 4; MYPERSON* prsnArr = new MYPERSON [nCount]; CString strTmp; m_lstOutput.ResetContent (); for (int nI=0; nI<nCount ; nI++) { strTmp.Format(_T("First Name %d"), nI+1); StringCchCopyW(prsnArr[nI].FName, MAX_NAME_LENGTH, strTmp); strTmp.Format(_T("Last Name %d"), nI+1); StringCchCopyW(prsnArr[nI].LName, MAX_NAME_LENGTH, strTmp); prsnArr [nI].Age = 20 + (nI+ 1)*2 ; prsnArr [nI].Salary = 20000 + (nI+ 1) * 1000; strTmp.Format(_T("Person %d=[(%s %s, Age=[%d], Salary=[%.2lf])]"), nI, prsnArr [nI].FName, prsnArr [nI].LName, prsnArr [nI].Age, prsnArr [nI].Salary); m_lstOutput.AddString (strTmp); } ModifyPersonStructArray(nCount, prsnArr ); m_lstOutput.AddString(_T("After Call ==>")); for (int nI=0; nI<nCount ; nI++) { strTmp.Format(_T("Person %d=[(%s %s, Age=[%d], Salary=[%.2lf])]"), nI, prsnArr [nI].FName, prsnArr [nI].LName, prsnArr [nI].Age, prsnArr [nI].Salary); m_lstOutput.AddString (strTmp); }
Примечание : m_lstOutput-это управляющая переменная (ListBox) в диалоговом окне MFC.
Когда я запускаюсь в режиме отладки, я получаю такое сообщение об ошибке,
Windows запустила точку останова в MFCClient.exe.
Это может быть связано с повреждением кучи, что указывает на ошибку в работе системы. MFCClient.exe или любой из загруженных им библиотек DLL.
Это также может быть связано с тем, что пользователь нажимает клавишу F12 во время MFCClient.exe имеет фокус.
Окно вывода может содержать дополнительную диагностическую информацию.
Что я здесь делаю не так ?
Что я уже пробовал:
Я перенес функцию DLL в сам класс Dialog. любить.
void CMFCClientDlg::ModifyPersonStructArray(int nCount, MYPERSON * pPersonArr) { for ( int nI = 0; nI < nCount; nI++ ) { wcscat_s(pPersonArr[nI].FName, MAX_NAME_LENGTH, L"-Modified"); wcscat_s(pPersonArr[nI].LName, MAX_NAME_LENGTH, L"-Modified"); pPersonArr[nI].Age = pPersonArr[nI].Age+ 5; pPersonArr[nI].Salary = pPersonArr[nI].Salary + 1000 ; } }
и у меня нет никаких проблем. это работает.
пожалуйста, предложите.
Shao Voon Wong
Пожалуйста, покажите, как вы получили указатель функции на эту функцию в dll.
Shao Voon Wong
Возможно, ваша библиотека dll устарела. Попробуйте очистить и перестроить проект dll и скопировать dll в папку исполняемого файла.
Praveen Kumar Katiyar
Я сделал полную перестройку всех мишеней. и скопировал обновленную dll в папку exe, но безрезультатно.