Я экспортировал метод из C ++ DLL и затем вызвал его из приложения форм VB.net. В настоящее время метод C ++ не имеет возвращаемого значения (void), но я хочу улучшить его и вернуть int, представляющий серию кодов ошибок. (Я планирую вернуть ноль, если все прошло хорошо.)
Где и как лучше всего определить эти коды ошибок?
Должен ли я сделать следующее в верхней части моего файла CPP:
#define ERR_NEGATIVE_CELL_SIZE 1
#define ERR_INVALID_FILE_PATH 2
etc
Приложение VB.net также определит эти же коды и затем покажет пользователю сообщения на основе кода.
Очевидно, что я бы предпочел бросить исключение в DLL и перехватить его (вместе с соответствующим сообщением об исключении) в VB.net, но это не представляется возможным при использовании метода extern «C» __declspec (dllexport).
Рад слышать об альтернативных шаблонах дизайна. Я также планирую представить методы DLL через исполняемый файл консоли C ++, поэтому хранение сообщений об ошибках один раз в DLL и обеспечение их доступности для консоли и приложений пользовательского интерфейса является идеальным.
Если вы хотите, чтобы коды ошибок были доступны для других модулей компиляции, лучше всего их поместить в заголовочный файл. Обычно при написании кода библиотеки вы создаете один или несколько файлов заголовков, которые объявляют все константы, типы, функции и классы, необходимые для использования библиотеки. Реализации затем компилируются в библиотеку. Потребитель библиотеки включает ваши заголовки и библиотеку импорта.
Что касается ваших констант, вы предлагаете использовать #define
объявить их. Не делай этого. Подумайте об использовании констант или перечислений. Как правило, препроцессор — это то, что нужно использовать как можно меньше.
Пожалуйста, избегайте препроцессора, где это возможно.
Для вашего сценария определение enum будет разумным.
Определите его рядом с прототипом функции.
Для показа переводов используйте функцию перевода и экспортируйте ее тоже.
Что-то вроде:
size_t TranslateError(int error, char* buffer, size_t size)
Возвращает: размер переведенного сообщения, сообщение в буфере при возврате <= длина