Я новый для C++, нужно использовать его только для создания расширения пространства имен оболочки для приложения C#.векторный дескриптор не работает в _CrtIsValidHeapPointer
У меня есть следующий код:
#ifdef MAKEDLL
# define DLLEXPORT __declspec(dllexport)
#else
# define DLLEXPORT __declspec(dllimport)
#endif
//...
DLLEXPORT class NativeFtp
{
public:
DLLEXPORT void Initialize(string uniqeId);
DLLEXPORT vector<FTPSITEACCESS> GetSites();
} _NativeFtp;
//...
vector<FTPSITEACCESS> NativeFtp::GetSites()
{
vector<FTPSITEACCESS> vec;
FTPSITEACCESS st;
st.SiteName = "ftp://10.20.3.251/";
st.Password = "";
st.Login = "";
vec.push_back(st);
return vec;
}
Другие библиотеки:
STDMETHODIMP CShellFolderImpl::EnumObjects (HWND hwndOwner, DWORD dwFlags,
LPENUMIDLIST* ppEnumIDList)
{
// Skipped
vector<FTPSITEACCESS> ftpSites = m_ftp.GetSites();
vector<char*> names;
/*for(vector<FTPSITEACCESS>::iterator it = ftpSites.begin(); it != ftpSites.end(); ++it) {
//char* ch = new char[(*it).SiteName.size()+1];
//ch[(*it).SiteName.size()] = '/0';
//std::copy((*it).SiteName.begin(),(*it).SiteName.end(),ch);
//names.push_back(strdup(ch)); //TODO:FREE
}*/
// Skipped
return hr;
}
Этот код не будет работать на 'return hr'
в _CrtIsValidHeapPointer
, которая вызывается деструктор вектора. Я попытался сделать NativeFtp::GetSites()
return vector<FTPSITEACCESS>*
, а также vector<FTPSITEACCESS*>*
, а затем удалить его до 'return hr'
, но он не работает таким же образом.
Это будет быстрый сбой, когда вызывающий и вызываемый не используют одну и ту же библиотеку времени выполнения C. Требуется компиляция с/MD и точная версия компилятора с одинаковыми настройками. –
Спасибо, это работает, но для отладки я использовал/MDd. – m3f
C++ как обычно показывает результат проблемы, а не причину, которая представляет собой огромный штраф времени, по сравнению с C#. – m3f