使用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);
}
}
当我在控制台应用程序中使用此类时,在另一个文件中使用main方法(所有在同一名称空间中),实例化类对象并调用方法,它就像一个冠军。所以,既然我知道基本代码可以工作,我使用类头和代码文件打开一个dll项目。当然我要添加dll宏,即:
#ifdef IMAGEDLL_EXPORTS
#define DLL __declspec(dllexport)
#else
#define DLL __declspec(dllimport)
#endif
并将类定义更改为“类DLL ImageExport”。很好地编译了一个DLL和.lib文件(没有错误,没有警告)。现在测试这个dll我使用与之前相同的main方法打开另一个控制台项目并链接到(dll)lib文件。有问题,追查时是两个字段未设置的结果;两者的值都为0.返回第一个控制台应用程序并打印出值:dwOutputId为1535(#define FI_JPEGFIF 1535),dwSpecType为2(#define IOTYPE_ANSIPATH 2)。
现在,如果我在课外分配这些值,我可以看到可见性如何不同,但为什么dll中的赋值不起作用?这是在dll中有一个类吗?
答案 0 :(得分:1)
此:
if(outputId == "jpeg")
应该是:
if(strcmp( outputId, "jpeg" ) == 0 )
和其他地方一样。您正在比较指针,这可能(取决于您的编译器,月亮的相位等)可能是“jpeg”文字的不同副本。