HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Проблема с дллкой (С++ Builder)
  #1  
Старый 09.09.2009, 10:43
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
С нами: 10535289

Репутация: 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
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
С нами: 10097606

Репутация: 3349


По умолчанию

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

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

Репутация: 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
С нами: 8775466

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

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

  #5  
Старый 09.09.2009, 12:19
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
С нами: 10535289

Репутация: 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#, Rust, Swift, Go, Java, Perl, Ruby 1 11.08.2009 11:27
Непонятная проблема с интернетом по всей локалке ZneP Для Администратора 6 19.06.2009 15:27
[Статья] Создание расширения для Windows Explorer при помощи C++ Builder Dobby007 С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby 2 29.03.2009 08:58
С++ Builder проблема с кучей _nic С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby 13 06.02.2009 01:26



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


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




ANTICHAT ™ © 2001- Antichat Kft.