Есть дллка с ф-цией Code: extern "C" __declspec(dllexport) void listDrives(vector <string> &drives) { 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)); drives.insert(drives.begin(),string(out)); Exit: memset(out,NULL,strlen(out)); DR->ReleaseExclusiveAccess(); DR->Release(); } delete []out; } Пытаюсь её заюзать Code: #include <vector> #include <map> #include <string> ....................................................... using namespace std; HINSTANCE hLib; typedef void (WINAPI *listDrivesfunc)(vector <string> &drives); listDrivesfunc listDrives; ........................................................ hLib=LoadLibrary("dlld.dll"); if(hLib==NULL) { TerminateProcess(GetCurrentProcess(),0); } ........................................................ listDrives=(listDrivesfunc)GetProcAddress((HMODULE)hLib,"listDrives"); vector <string> drvs; listDrives(drvs);//тут выбивает external exception E06D7363 Насколько я понял после гугления проблема в передаваемой переменной в ф-цию.Но почему непонял Вопрос- где я мог накосячить?
>>> TerminateProcess(GetCurrentProcess(),0); <<< Поржал. Для этого есть функция ExitProcess ты тут чтото типа напутал с типами вроде в функции описано - vector <string> &drives а передаеш vector <string> drvs;
Подход в корне не правельный. Память надо выделять либо в .dll либо тот кто юзает библиотеку, но только в одном модуле и соответственно в нем же и освобождать. Коде же выделение память в двух местах будет происходит(разные модули) а освобождение в одном. И передавать лучше по указателю а не по ссылки.
А как передавать указатели на контейнеры STL ? Code: extern "C" __declspec(dllexport) void listDrives(vector <string> *drives) При юзе "Eacces Violation"