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;
}
Проблема с дллкой
Код:
Пытаюсь её заюзать
Код:
#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
#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
Насколько я понял после гугления проблема в передаваемой переменной в ф-цию.Но почему непонял :(
Вопрос- где я мог накосячить?
делай через указатель, а лучше вообще откажись от stl
Все из той же серии с выделением и освобождением памяти в разных модулях.
Цитата: oxotnik333
делай через указатель, а лучше вообще откажись от stl
То есть указатель?
Код:
extern "C" __declspec(dllexport) void listDrives(vector <string> *drives)
Если так то получаю "Eacces violation"
Да, к стати, а адрес ф-ции то получается или он нулевой?
чет мне кажется что вот так его надо получать:
Код:
listDrives=(listDrivesfunc)GetProcAddress((HMODULE)hLib,"_listDrives");
С ругней на такое
Цитата:
Expression:("_Pvector==NULL || (((_Myvec*)_Pvector)->_Nyfirst<=_Ptr && _Ptr<=((_Myvec*)_Pvector)->_Mylast)",0)
или используй какой нибудь простой типа данных char** LPSTR*, SAFEARRAY можно, или собирай, как сказано выше
Цитата:
Я дллку собирал в MS VC++ 2008.
, а все остальное видимо на борланде.
No Comments.
http://www.progz.ru/forum/index.php?showtopic=13628 пришли к мнению что разные всего лишь алгоритмы выделения памяти.
Тут
примерно об этом и говорилось выше
ЗЫ: Boost тоже так же по разному ,в выше названных средах, реализован?
Цитата: _nic
Так может можно передать в ф-цию ещё и аллокатор от "статического" контейнера в программе?
ЗЫ: Boost тоже так же по разному ,в выше названных средах, реализован?
ЗЫ: Boost тоже так же по разному ,в выше названных средах, реализован?
ради того, чтобы передать 3 строки ты будешь бустом все засирать???
еще раз повторю: чтобы не иметь геморроя построения в разных средах - используй чисто системные типы данных