2010-05-11 18 views
1

使用VS 2008 有一個C++類,我從第三方DLL調用函數。在頭文件中的定義如下:分配不工作在一個DLL導出C++類

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,我打開另一個控制檯項目使用與以前相同的主要方法並鏈接到(dll)lib文件。遇到問題時,這些問題是由於兩個領域沒有設定的結果;返回到第一個控制檯應用程序並打印出值:dwOutputId是1535(#define FI_JPEGFIF 1535)和dwSpecType是2(#define IOTYPE_ANSIPATH 2)。

現在,如果我在類的外部分配這些值,我可以看到可見度可能會有所不同,但爲什麼dll中的賦值不起作用?是否有關於在dll中上課的信息?

回答

1

此:

if(outputId == "jpeg") 

應該是:

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

和別處類似。您正在比較指針,這些指針可能(取決於您的編譯器,月亮的相位等)可能與「jpeg」文字的不同副本有關。

+0

現在不能接受(5分鐘去),但我會。在第一款遊戲機應用程序中,我真幸運嗎? – 2010-05-11 17:02:41

+0

@Jim控制檯應用程序可能會將「jpeg」的所有副本減少爲一個具有單個地址的實例。 EXE和DLL組合可能有兩個不同的實例,一個在EXE中,另一個在DLL中。 – 2010-05-11 17:06:00

+0

ahh在驅動程序(控制檯應用程序)和dll中的副本。確定接受,謝謝。 – 2010-05-11 17:08:00