Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с дллкой

841
09 сентября 2009 года
_nic
199 / / 29.07.2006
Есть дллка с ф-цией
Код:
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

Насколько я понял после гугления проблема в передаваемой переменной в ф-цию.Но почему непонял :(
Вопрос- где я мог накосячить?
11
09 сентября 2009 года
oxotnik333
2.9K / / 03.08.2007
делай через указатель, а лучше вообще откажись от stl
260
09 сентября 2009 года
Ramon
1.1K / / 16.08.2003
Все из той же серии с выделением и освобождением памяти в разных модулях.
841
09 сентября 2009 года
_nic
199 / / 29.07.2006
Цитата: oxotnik333
делай через указатель, а лучше вообще откажись от stl



То есть указатель?

 
Код:
extern "C" __declspec(dllexport) void listDrives(vector <string> *drives)

Если так то получаю "Eacces violation"
11
09 сентября 2009 года
oxotnik333
2.9K / / 03.08.2007
длл и вызывающее приложение должны быть собраны в одной среде, с абсолютно одинаковыми опциями.
Да, к стати, а адрес ф-ции то получается или он нулевой?
чет мне кажется что вот так его надо получать:
 
Код:
listDrives=(listDrivesfunc)GetProcAddress((HMODULE)hLib,"_listDrives");
841
09 сентября 2009 года
_nic
199 / / 29.07.2006
Я дллку собирал в MS VC++ 2008.И кажется он непереваривает такое обьявление переменной vector <string> *drives.Теперь вываливается окно дебага VC++
С ругней на такое
Цитата:

Expression:("_Pvector==NULL || (((_Myvec*)_Pvector)->_Nyfirst<=_Ptr && _Ptr<=((_Myvec*)_Pvector)->_Mylast)",0)

11
09 сентября 2009 года
oxotnik333
2.9K / / 03.08.2007
реализация STL в вижуале и в борланде отличаются, отсюда весь косяк.
или используй какой нибудь простой типа данных char** LPSTR*, SAFEARRAY можно, или собирай, как сказано выше
260
09 сентября 2009 года
Ramon
1.1K / / 16.08.2003
Замечательно, помимо всего прочего теперь еще и
Цитата:
Я дллку собирал в MS VC++ 2008.

, а все остальное видимо на борланде.

No Comments.

841
09 сентября 2009 года
_nic
199 / / 29.07.2006
Тут http://www.progz.ru/forum/index.php?showtopic=13628 пришли к мнению что разные всего лишь алгоритмы выделения памяти.
11
09 сентября 2009 года
oxotnik333
2.9K / / 03.08.2007
примерно об этом и говорилось выше
841
09 сентября 2009 года
_nic
199 / / 29.07.2006
Так может можно передать в ф-цию ещё и аллокатор от "статического" контейнера в программе?
ЗЫ: Boost тоже так же по разному ,в выше названных средах, реализован?
11
10 сентября 2009 года
oxotnik333
2.9K / / 03.08.2007
Цитата: _nic
Так может можно передать в ф-цию ещё и аллокатор от "статического" контейнера в программе?
ЗЫ: Boost тоже так же по разному ,в выше названных средах, реализован?


ради того, чтобы передать 3 строки ты будешь бустом все засирать???
еще раз повторю: чтобы не иметь геморроя построения в разных средах - используй чисто системные типы данных

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог