Проблема с дллкой (С++ Builder)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _nic, 9 Sep 2009.

  1. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Есть дллка с ф-цией
    Code:
    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;
    }
    
    Пытаюсь её заюзать
    Code:
    #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
    
    Насколько я понял после гугления проблема в передаваемой переменной в ф-цию.Но почему непонял :(
    Вопрос- где я мог накосячить?
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    >>> TerminateProcess(GetCurrentProcess(),0); <<< Поржал. Для этого есть функция ExitProcess
    ты тут чтото типа напутал с типами вроде
    в функции описано - vector <string> &drives
    а передаеш vector <string> drvs;
     
  3. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Непонял что я тут попутал?Из за ссылки что ли такое может вылезать?
    ЗЫ:
    Люблю рекурсию :D
     
  4. half-blood

    half-blood New Member

    Joined:
    8 Sep 2009
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Подход в корне не правельный.
    Память надо выделять либо в .dll либо тот кто юзает библиотеку, но только в одном модуле и соответственно в нем же и освобождать.
    Коде же выделение память в двух местах будет происходит(разные модули) а освобождение в одном. И передавать лучше по указателю а не по ссылки.
     
  5. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    А как передавать указатели на контейнеры STL ?
    Code:
    extern "C" __declspec(dllexport) void listDrives(vector <string> *drives)
    
    При юзе "Eacces Violation"
     
    #5 _nic, 9 Sep 2009
    Last edited: 9 Sep 2009