使用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中上課的信息?
現在不能接受(5分鐘去),但我會。在第一款遊戲機應用程序中,我真幸運嗎? – 2010-05-11 17:02:41
@Jim控制檯應用程序可能會將「jpeg」的所有副本減少爲一個具有單個地址的實例。 EXE和DLL組合可能有兩個不同的實例,一個在EXE中,另一個在DLL中。 – 2010-05-11 17:06:00
ahh在驅動程序(控制檯應用程序)和dll中的副本。確定接受,謝謝。 – 2010-05-11 17:08:00