Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Проблема с дллкой (С++ Builder) (https://forum.antichat.xyz/showthread.php?t=140323)

_nic 09.09.2009 10:43

Проблема с дллкой (С++ Builder)
 
Есть дллка с ф-цией
Код:

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

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

slesh 09.09.2009 11:06

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

_nic 09.09.2009 11:33

Цитата:

Сообщение от slesh
ты тут чтото типа напутал с типами вроде
в функции описано - vector <string> &drives
а передаеш vector <string> drvs;

Непонял что я тут попутал?Из за ссылки что ли такое может вылезать?
ЗЫ:
Цитата:

Сообщение от slesh
>>> 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"


Время: 05:55