ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

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

  #2  
Старый 09.09.2009, 11:06
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

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

  #3  
Старый 09.09.2009, 11:33
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме:
2982851

Репутация: 107


По умолчанию

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

  #4  
Старый 09.09.2009, 12:01
half-blood
Новичок
Регистрация: 08.09.2009
Сообщений: 1
Провел на форуме:
3349

Репутация: 0
По умолчанию

Подход в корне не правельный.
Память надо выделять либо в .dll либо тот кто юзает библиотеку, но только в одном модуле и соответственно в нем же и освобождать.
Коде же выделение память в двух местах будет происходит(разные модули) а освобождение в одном. И передавать лучше по указателю а не по ссылки.
 
Ответить с цитированием

  #5  
Старый 09.09.2009, 12:19
_nic
Постоянный
Регистрация: 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)
 


Быстрый переход




ANTICHAT.XYZ