我正在使用LibTiff v4.0.3。

我可以在多字节中完美地工作,但是当我尝试使用Unicode时,出现运行时异常。

我可以将问题简化为一行:

#include "tiffio.h"

int _tmain(int argc, _TCHAR* argv[])

{
    TIFF* tif = TIFFOpenW(L"D:\\Myfile", "r");
}


这将完美工作:TIFF* tif = TIFFOpen("D:\\Myfile", "r");

我无法获得确切的异常代码,但是代码堆栈如下所示:

msvcr110.dll!__crt_debugger_hook(int _Reserved) Line 60 C
msvcr110.dll!_call_reportfault(int nDbgHookCode, unsigned long dwExceptionCode, unsigned long dwExceptionFlags) Line 155    C++
msvcr110.dll!_invoke_watson(const wchar_t * pszExpression, const wchar_t * pszFunction, const wchar_t * pszFile, unsigned int nLine, unsigned __int64 pReserved) Line 139   C++
msvcr110.dll!_invalid_parameter(const wchar_t * pszExpression, const wchar_t * pszFunction, const wchar_t * pszFile, unsigned int nLine, unsigned __int64 pReserved) Line 85    C++
msvcr110.dll!_invalid_parameter_noinfo() Line 97    C++
msvcr110.dll!_read(int fh, void * buf, unsigned int cnt) Line 84    C
ConsoleApplication1.exe!TIFFFdOpen()    C
ConsoleApplication1.exe!TIFFClientOpen()    C
ConsoleApplication1.exe!TIFFFdOpen()    C
ConsoleApplication1.exe!TIFFOpenW() C
ConsoleApplication1.exe!wmain(int argc, wchar_t * * argv) Line 21   C++
ConsoleApplication1.exe!__tmainCRTStartup() Line 533    C
ConsoleApplication1.exe!wmainCRTStartup() Line 377  C
kernel32.dll!BaseThreadInitThunk()  Unknown
ntdll.dll!RtlUserThreadStart()  Unknown


我尝试使用@err@err,hr,但是它们显示没有错误。

如何获得Unicode版本的工作?我需要以其他方式编译库吗?
 (我已经检查过,在libtiff中没有检查预处理程序变量UNICODE。)

最佳答案

事实证明,以Unicode链接到调试模式项目时,需要对库进行一些不同的编译。

转到您的libtiff文件夹,然后打开nmake.opt进行编辑。
更改编译标志以使用调试CRT dll(/ MDd):

OPTFLAGS =  /Ox /MDd /EHsc /W3 /D_CRT_SECURE_NO_DEPRECATE


而不是/ MD

现在重建库。

"C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\vcvars32.bat"  x86
nmake /f makefile.vc   [clean]


或对于x64:

"C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\amd64\vcvars64.bat"  amd64
  nmake /f makefile.vc   [clean]


在进行调试配置时,请确保您的项目链接到该文件

10-08 18:34