STL из DLL

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 9 сен 2009.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Читал вот это http://www.progz.ru/forum/index.php?showtopic=13628 Конечно интересные разсуждения. Но всеравно не понятно,можно ли все таки каким то извратом передавать STL контейнеры в DLL и обратно.Насколько я понял указатель на кучу из программы не передается в ф-цию внутри динамической библиотеки.То есть кроме вектора надо ещё передать аллокатор,или просто только один аллокатор?Или это вообще невозможно и работать небудет?
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Если аллокатор работает со своей кучей, то будет работать в любом модуле. Единственно сам контейнер надо удалять там где он был создан.
     
  3. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    _nic, эээ, большая часть STL в headers и след-но код конкретного контейнера будет там откуда он вызывается.

    Тут три главных вопроса:

    1) используется ли CRT в shared виде (DLL)? То есть, общий ли heap?

    2) ты хочешь vector видеть в интерфейсе или использовать внутри?

    3) компилится ли всё одним компилером?

    Если все три - "да", то всё пучком - делай что хочешь, всё будет работать. Как только один из ответов "нет" то надо смотреть. Обычное решение это С API:

    void DoStuff(Struct *array, size_t size);

    DoStuff(&myVect[0], myVect.size());
     
  4. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    1.Да
    2.Для передачи данных в ф-цию
    3.Собираю ддлку в VC++ но хочу что бы с ней можно было работать во всех остальных IDE C++ по этому сейчас эксперементирую Borland C++ Builder. Но мне кажется в каждом IDE своя реалезация STL
    Вот ф-ция с которой эксперментирую
    Код (Text):
    1. extern "C" __declspec(dllexport) void listDrives(vector <string> &drives)
    2. {
    3.     vector <string> ssw;
    4.     char *out=new char[1024*12];
    5.     IDiscMaster2 *DM;
    6.     IEnumVARIANT *Enum;
    7.     unsigned long count=0;
    8.     long drvNums;
    9.     VARIANT DI;
    10.     BSTR volume,app=bstr_t("T_T"),vendor,prod;
    11.     char letter[5];
    12.     HRESULT hr=0;
    13.     CoCreateInstance(__uuidof(MsftDiscMaster2), NULL, CLSCTX_INPROC_SERVER, __uuidof(IDiscMaster2),(void**)&DM);       
    14.     DM->get_Count(&drvNums);
    15.     DM->get__NewEnum(&Enum);
    16.     for(int i=0;i<drvNums;i++)
    17.     {
    18.         IDiscRecorder2 *DR;
    19.         hr=CoCreateInstance(__uuidof(MsftDiscRecorder2),NULL,CLSCTX_INPROC_SERVER,__uuidof(IDiscRecorder2),(void**)&DR);
    20.         if(hr!=S_OK){goto Exit;}
    21.         Enum->Next(1,&DI,&count);
    22.         hr=DR->InitializeDiscRecorder(DI.bstrVal);
    23.         if(hr!=S_OK){goto Exit;}
    24.         hr=DR->AcquireExclusiveAccess(false,app);
    25.         if(hr!=S_OK){goto Exit;}
    26.         hr=DR->get_VolumeName(&volume);
    27.         if(hr!=S_OK){goto Exit;}
    28.         GetVolumePathNamesForVolumeName(_com_util::ConvertBSTRToString(volume),letter,5,NULL);
    29.         /*hr=DR->get_VendorId(&vendor);
    30.         if(hr!=S_OK){goto Exit;}
    31.         hr=DR->get_ProductId(&prod);
    32.         if(hr!=S_OK){goto Exit;}*/
    33.         wsprintf(out,"%s;%s",letter,_com_util::ConvertBSTRToString(DI.bstrVal));
    34.         ssw.insert(ssw.begin(),string(out));
    35.         Exit:
    36.         memset(out,NULL,strlen(out));
    37.         DR->ReleaseExclusiveAccess();
    38.         DR->Release();
    39.     }
    40.     //ssw.swap(drives);
    41.     drives.swap(ssw);
    42.     delete []out;
    43. }
    Юз
    Код (Text):
    1.            typedef void (__cdecl *listDrivesfunc)(vector <string> &drives);
    2.     listDrivesfunc listDrives;
    3.     HINSTANCE hLib=LoadLibrary("dldddddd.dll");
    4.     listDrives=(listDrivesfunc)GetProcAddress((HMODULE)hLib,"listDrives");
    5.     vector <string > drives;
    6.     listDrives(drives);
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Мусьё любитель извращений?
     
  6. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    _nic, в Борланде свой STL и свой heap manager. То есть:

    3) нет

    и след-но послать std::vector как параметр не получится.