ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
Проблема с дллкой (С++ Builder) |

09.09.2009, 10:43
|
|
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме: 2982851
Репутация:
107
|
|
Проблема с дллкой (С++ 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
Насколько я понял после гугления проблема в передаваемой переменной в ф-цию.Но почему непонял 
Вопрос- где я мог накосячить?
|
|
|

09.09.2009, 11:06
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
>>> TerminateProcess(GetCurrentProcess(),0); <<< Поржал. Для этого есть функция ExitProcess
ты тут чтото типа напутал с типами вроде
в функции описано - vector <string> &drives
а передаеш vector <string> drvs;
|
|
|

09.09.2009, 11:33
|
|
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме: 2982851
Репутация:
107
|
|
Сообщение от slesh
ты тут чтото типа напутал с типами вроде
в функции описано - vector <string> &drives
а передаеш vector <string> drvs;
Непонял что я тут попутал?Из за ссылки что ли такое может вылезать?
ЗЫ:
Сообщение от slesh
>>> TerminateProcess(GetCurrentProcess(),0); <<< Поржал. Для этого есть функция ExitProcess
Люблю рекурсию 
|
|
|

09.09.2009, 12:01
|
|
Новичок
Регистрация: 08.09.2009
Сообщений: 1
Провел на форуме: 3349
Репутация:
0
|
|
Подход в корне не правельный.
Память надо выделять либо в .dll либо тот кто юзает библиотеку, но только в одном модуле и соответственно в нем же и освобождать.
Коде же выделение память в двух местах будет происходит(разные модули) а освобождение в одном. И передавать лучше по указателю а не по ссылки.
|
|
|

09.09.2009, 12:19
|
|
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме: 2982851
Репутация:
107
|
|
А как передавать указатели на контейнеры STL ?
Код:
extern "C" __declspec(dllexport) void listDrives(vector <string> *drives)
При юзе "Eacces Violation"
Последний раз редактировалось _nic; 09.09.2009 в 12:26..
|
|
|
|
 |
Похожие темы
|
| Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
|
Проблема с дедиками [help!]
|
Sniper482 |
Безопасность |
4 |
14.09.2009 21:22 |
|
Embarcadero: C++ Builder 2009
|
Kollinz |
С/С++, C#, Delphi, .NET, Asm |
1 |
11.08.2009 11:27 |
|
Непонятная проблема с интернетом по всей локалке
|
ZneP |
Администрирование |
6 |
19.06.2009 15:27 |
|
[Статья] Создание расширения для Windows Explorer при помощи C++ Builder
|
Dobby007 |
С/С++, C#, Delphi, .NET, Asm |
2 |
29.03.2009 08:58 |
|
С++ Builder проблема с кучей
|
_nic |
С/С++, C#, Delphi, .NET, Asm |
13 |
06.02.2009 01:26 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|