Читал вот это http://www.progz.ru/forum/index.php?showtopic=13628 Конечно интересные разсуждения. Но всеравно не понятно,можно ли все таки каким то извратом передавать STL контейнеры в DLL и обратно.Насколько я понял указатель на кучу из программы не передается в ф-цию внутри динамической библиотеки.То есть кроме вектора надо ещё передать аллокатор,или просто только один аллокатор?Или это вообще невозможно и работать небудет?
Если аллокатор работает со своей кучей, то будет работать в любом модуле. Единственно сам контейнер надо удалять там где он был создан.
_nic, эээ, большая часть STL в headers и след-но код конкретного контейнера будет там откуда он вызывается. Тут три главных вопроса: 1) используется ли CRT в shared виде (DLL)? То есть, общий ли heap? 2) ты хочешь vector видеть в интерфейсе или использовать внутри? 3) компилится ли всё одним компилером? Если все три - "да", то всё пучком - делай что хочешь, всё будет работать. Как только один из ответов "нет" то надо смотреть. Обычное решение это С API: void DoStuff(Struct *array, size_t size); DoStuff(&myVect[0], myVect.size());
1.Да 2.Для передачи данных в ф-цию 3.Собираю ддлку в VC++ но хочу что бы с ней можно было работать во всех остальных IDE C++ по этому сейчас эксперементирую Borland C++ Builder. Но мне кажется в каждом IDE своя реалезация STL Вот ф-ция с которой эксперментирую Код (Text): extern "C" __declspec(dllexport) void listDrives(vector <string> &drives) { vector <string> ssw; char *out=new char[1024*12]; IDiscMaster2 *DM; IEnumVARIANT *Enum; unsigned long count=0; long drvNums; VARIANT DI; BSTR volume,app=bstr_t("T_T"),vendor,prod; char letter[5]; HRESULT hr=0; CoCreateInstance(__uuidof(MsftDiscMaster2), NULL, CLSCTX_INPROC_SERVER, __uuidof(IDiscMaster2),(void**)&DM); DM->get_Count(&drvNums); DM->get__NewEnum(&Enum); for(int i=0;i<drvNums;i++) { IDiscRecorder2 *DR; hr=CoCreateInstance(__uuidof(MsftDiscRecorder2),NULL,CLSCTX_INPROC_SERVER,__uuidof(IDiscRecorder2),(void**)&DR); if(hr!=S_OK){goto Exit;} Enum->Next(1,&DI,&count); hr=DR->InitializeDiscRecorder(DI.bstrVal); if(hr!=S_OK){goto Exit;} hr=DR->AcquireExclusiveAccess(false,app); if(hr!=S_OK){goto Exit;} hr=DR->get_VolumeName(&volume); if(hr!=S_OK){goto Exit;} GetVolumePathNamesForVolumeName(_com_util::ConvertBSTRToString(volume),letter,5,NULL); /*hr=DR->get_VendorId(&vendor); if(hr!=S_OK){goto Exit;} hr=DR->get_ProductId(&prod); if(hr!=S_OK){goto Exit;}*/ wsprintf(out,"%s;%s",letter,_com_util::ConvertBSTRToString(DI.bstrVal)); ssw.insert(ssw.begin(),string(out)); Exit: memset(out,NULL,strlen(out)); DR->ReleaseExclusiveAccess(); DR->Release(); } //ssw.swap(drives); drives.swap(ssw); delete []out; } Юз Код (Text): typedef void (__cdecl *listDrivesfunc)(vector <string> &drives); listDrivesfunc listDrives; HINSTANCE hLib=LoadLibrary("dldddddd.dll"); listDrives=(listDrivesfunc)GetProcAddress((HMODULE)hLib,"listDrives"); vector <string > drives; listDrives(drives);
_nic, в Борланде свой STL и свой heap manager. То есть: 3) нет и след-но послать std::vector как параметр не получится.