Error handling вызов метода из dll
От: indee  
Дата: 29.01.20 09:02
Оценка:
Мастерю DLL (VS C++).

Хотелось бы реализовать сообщение об ошибке в экспортируемом методе DLL как в Java:

public int myMethod(int param) throws Exception{

 try{
   
   ...

 }catch(Exception E){

    throw new Exception("ошибка...")

 }
 ...

 return i;        

}


т.е. если метод выполнен без ошибки он вернет значение int, а при ошибке швырнет Exception с моей информацией.

Как такое правильно ревлизовать в DLL (MS C++)?

Спасибо!
Re: Error handling вызов метода из dll
От: Maniacal Россия  
Дата: 29.01.20 09:27
Оценка:
Здравствуйте, indee, Вы писали:

I>Мастерю DLL (VS C++).


I>Хотелось бы реализовать сообщение об ошибке в экспортируемом методе DLL как в Java:


I>
I>public int myMethod(int param) throws Exception{

I> try{
   
I>   ...

I> }catch(Exception E){

I>    throw new Exception("ошибка...")

I> }
I> ...

I> return i;        

I>}
I>


I>т.е. если метод выполнен без ошибки он вернет значение int, а при ошибке швырнет Exception с моей информацией.


I>Как такое правильно ревлизовать в DLL (MS C++)?


I>Спасибо!


Так же почти.

В header'е:
#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif

DLL_API int myMethod();


В .cpp:
DLL_API int myMethod()
{
  int i;
 try{
   
   ...

 }catch(Exception E){

    throw new Exception("ошибка...")

 }
 ...

 return i;        

}
Re[2]: Error handling вызов метода из dll
От: indee  
Дата: 13.02.20 07:10
Оценка:
Вряд ли это будет работать,
Скорее всего будет access violation at address... тем более, если DLL используется в Delphi или Python.

Здравствуйте, Maniacal, Вы писали:

M>Здравствуйте, indee, Вы писали:


I>>Мастерю DLL (VS C++).


I>>Хотелось бы реализовать сообщение об ошибке в экспортируемом методе DLL как в Java:


I>>
I>>public int myMethod(int param) throws Exception{

I>> try{
   
I>>   ...

I>> }catch(Exception E){

I>>    throw new Exception("ошибка...")

I>> }
I>> ...

I>> return i;        

I>>}
I>>


I>>т.е. если метод выполнен без ошибки он вернет значение int, а при ошибке швырнет Exception с моей информацией.


I>>Как такое правильно ревлизовать в DLL (MS C++)?


I>>Спасибо!


M>Так же почти.


M>В header'е:

M>
M>#ifdef DLL_EXPORTS
M>#define DLL_API __declspec(dllexport)
M>#else
M>#define DLL_API __declspec(dllimport)
M>#endif

M>DLL_API int myMethod();
M>


M>В .cpp:

M>
M>DLL_API int myMethod()
M>{
M>  int i;
M> try{
   
M>   ...

M> }catch(Exception E){

M>    throw new Exception("ошибка...")

M> }
M> ...

M> return i;        

M>}
M>
Re: Error handling вызов метода из dll
От: Pzz Россия https://github.com/alexpevzner
Дата: 13.02.20 07:19
Оценка:
Здравствуйте, indee, Вы писали:

I>т.е. если метод выполнен без ошибки он вернет значение int, а при ошибке швырнет Exception с моей информацией.


I>Как такое правильно ревлизовать в DLL (MS C++)?


Лучше так не делать.
Re[3]: Error handling вызов метода из dll
От: Maniacal Россия  
Дата: 13.02.20 07:53
Оценка:
Здравствуйте, indee, Вы писали:

I>Вряд ли это будет работать,

I>Скорее всего будет access violation at address... тем более, если DLL используется в Delphi или Python.

А header C++'сный как Delphi или Python собирается подключать для импорта объектно-ориентированного интерфейса из DLL?

У меня для взаимодействия C++'ной DLL с Delphi написана прослойка с одной стороны на C++, с другой на Delphi. Со стороны Delphi есть функция, кидающая исключение, со стороны C++ вызовы всех экспортируемых функций обёрнуты в try-catch, где из исключения std::runtime_error извлекается строка и передаётся в функцию Delphi, где уже на стороне импортёра DLL кидается Delphi'йское исключение.
Re[4]: Error handling вызов метода из dll
От: indee  
Дата: 13.02.20 08:42
Оценка:
C++'сных хедеров и импорта объектно-ориентированного интерфейса из DLL нет.
Старый, добрый stdcall/winapi — иначе бы COM выбрал.

Здравствуйте, Maniacal, Вы писали:

M>Здравствуйте, indee, Вы писали:


I>>Вряд ли это будет работать,

I>>Скорее всего будет access violation at address... тем более, если DLL используется в Delphi или Python.

M>А header C++'сный как Delphi или Python собирается подключать для импорта объектно-ориентированного интерфейса из DLL?


M>У меня для взаимодействия C++'ной DLL с Delphi написана прослойка с одной стороны на C++, с другой на Delphi. Со стороны Delphi есть функция, кидающая исключение, со стороны C++ вызовы всех экспортируемых функций обёрнуты в try-catch, где из исключения std::runtime_error извлекается строка и передаётся в функцию Delphi, где уже на стороне импортёра DLL кидается Delphi'йское исключение.
Re[5]: Error handling вызов метода из dll
От: Chorkov Россия  
Дата: 13.02.20 09:46
Оценка:
Здравствуйте, indee, Вы писали:

I>C++'сных хедеров и импорта объектно-ориентированного интерфейса из DLL нет.

I>Старый, добрый stdcall/winapi — иначе бы COM выбрал.

winapi — на языке C.
Если хотите ограничиться языком С (не C++), то в нем нет исключений.
Некоторые библиотеки c-биндинга (например ctype для python) поймают стандартное std::exception, но я не советую...

Используйте коды возврата, и отдельную функцию, реализованную через threadlocal, для хранения текста сообщения об ошибке.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.