назначение не работает в dll экспортированном C ++ классе - PullRequest
1 голос
/ 11 мая 2010

Использование 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?

1 Ответ

1 голос
/ 11 мая 2010

Это:

if(outputId == "jpeg") 

должно быть:

if(strcmp( outputId, "jpeg" ) == 0 ) 

и аналогично в других местах. Вы сравниваете указатели, которые могут (в зависимости от вашего компилятора, фаз луны и т. Д.) Быть разными копиями литерала "jpeg".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...