Использование VS 2008
Есть класс C ++, в котором я вызываю функции из сторонних DLL. Определение в заголовочном файле выглядит следующим образом:
namespace OITImageExport
{
class ImageExport
{
private:
SCCERR seResult; /* Error code returned. */
VTHDOC hDoc; /* Input doc handle returned by DAOpenDocument(). */
VTHEXPORT hExport; /* Handle to the export returned by EXOpenExport(). */
VTDWORD dwFIFlags; /* Used in setting the SCCOPT_FIFLAGS option. */
VTCHAR szError[256]; /* Error string buffer. */
VTDWORD dwOutputId; /* Output Format. */
VTDWORD dwSpecType;
public:
ImageExport(const char* outputId, const char* specType);
void ProcessDocument(const char* inputPath, const char* outputPath);
~ImageExport();
};
}
В конструкторе я инициализирую два поля класса, имеющие значения, которые берутся из перечислений в сторонней dll:
ImageExport::ImageExport(const char* outputId, const char* specType)
{
if(outputId == "jpeg")
{
dwOutputId = FI_JPEGFIF;
}
if(specType == "ansi")
{
dwSpecType = IOTYPE_ANSIPATH;
}
seResult = DAInit();
if (seResult != SCCERR_OK)
{
DAGetErrorString(seResult, szError, sizeof(szError));
fprintf(stderr, "DAInit() failed: %s (0x%04X)\n", szError, seResult);
exit(seResult);
}
}
Когда я использую этот класс внутри консольного приложения с основным методом в другом файле (все в том же пространстве имен), создающим экземпляр объекта класса и вызывающим методы, он работает как чемпион. Итак, теперь, когда я знаю, что базовый код работает, я открываю проект dll, используя заголовок класса и файл кода. Конечно, я должен добавить макрос DLL, а именно:
#ifdef IMAGEDLL_EXPORTS
#define DLL __declspec(dllexport)
#else
#define DLL __declspec(dllimport)
#endif
и изменил определение класса на «class DLL ImageExport». Хорошо скомпилирован в файл dll и .lib (без ошибок, без предупреждений). Теперь, чтобы проверить эту dll, я открываю другой консольный проект, используя тот же метод main, что и раньше, и ссылаюсь на файл (dll) lib. Имели проблемы, которые когда отслеживались, были результатом того, что два поля не были установлены; оба имели значения 0. Вернулись в первое консольное приложение и распечатали значения: dwOutputId был 1535 (#define FI_JPEGFIF 1535), а dwSpecType был 2 (#define IOTYPE_ANSIPATH 2).
Теперь, если бы я присваивал эти значения за пределами класса, я мог видеть, как видимость может отличаться, но почему назначение в dll не работает? Это что-то о наличии класса в dll?