(1) Я подозреваю, что проблема с сопутствующей связью также существует, хотя простое предложение Лео, похоже, не помогло.
Является ли isConnected
виртуальным? Вполне возможно, что MinGW и VC ++ используют разные реализации для VTable, и в этом случае, ну, в общем, неудача.
Попытайтесь увидеть, как далеко вы продвинулись с отладчиком: он падает при вызове или при возврате? Вы получаете неправильный код? (Если вы знаете, как читать ассемблер, это обычно очень помогает в решении этих проблем.)
Либо добавьте операторы трассировки в различные методы, чтобы увидеть, как далеко вы продвинулись.
(2) Для общедоступного интерфейса DLL никогда не освобождайте память в вызывающей стороне, которая была выделена вызываемой стороной (или наоборот). Скорее всего, DLL работает с совершенно другой кучей, поэтому указатель неизвестен.
Если вы хотите положиться на это поведение, вам необходимо убедиться:
- Caller и Callee (т.е. в вашем случае DLL и основная программа) скомпилированы с одной и той же версией компилятора sam
- для всех поддерживаемых компиляторов вы настроили параметры компиляции, чтобы гарантировать, что вызывающий и вызываемый абоненты используют одно и то же общее состояние библиотеки времени выполнения.
Так что лучше всего изменить свой API на:
extern "C" __declspec(dllexport) DeviceDriverApi* GetX5Driver();
extern "C" __declspec(dllexport) void FreeDeviceDriver(DeviceDriverApi* driver);
и, в месте вызова, оберните каким-либо образом (например, в boost::intrusive_ptr
).