PDA

Просмотр полной версии : Проблема с дллкой (С++ Builder)


_nic
09.09.2009, 10:43
Есть дллка с ф-цией

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),NU LL,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::Convert BSTRToString(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;
}

Пытаюсь её заюзать

#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

Насколько я понял после гугления проблема в передаваемой переменной в ф-цию.Но почему непонял :(
Вопрос- где я мог накосячить?

slesh
09.09.2009, 11:06
>>> TerminateProcess(GetCurrentProcess(),0); <<< Поржал. Для этого есть функция ExitProcess
ты тут чтото типа напутал с типами вроде
в функции описано - vector <string> &drives
а передаеш vector <string> drvs;

_nic
09.09.2009, 11:33
ты тут чтото типа напутал с типами вроде
в функции описано - vector <string> &drives
а передаеш vector <string> drvs;
Непонял что я тут попутал?Из за ссылки что ли такое может вылезать?
ЗЫ:
>>> TerminateProcess(GetCurrentProcess(),0); <<< Поржал. Для этого есть функция ExitProcess

Люблю рекурсию :D

half-blood
09.09.2009, 12:01
Подход в корне не правельный.
Память надо выделять либо в .dll либо тот кто юзает библиотеку, но только в одном модуле и соответственно в нем же и освобождать.
Коде же выделение память в двух местах будет происходит(разные модули) а освобождение в одном. И передавать лучше по указателю а не по ссылки.

_nic
09.09.2009, 12:19
А как передавать указатели на контейнеры STL ?

extern "C" __declspec(dllexport) void listDrives(vector <string> *drives)

При юзе "Eacces Violation"