Abra o arquivo no taglib com o Unicode Chars no nome do arquivo
Pergunta
Eu sou muito novo na 'área' C ++, então espero que isso não seja apenas mais uma pergunta boba 'C ++'.
Aqui está o meu problema. Eu quero integrar Taglib (1.5, 1.6 assim que eu conseguir construí -lo para o Windows) em um projeto Windows MFC vs2005 existente. Preciso ler os metadados de arquivos de áudio (não gravar).
O problema é que o programa armazena os nomes de arquivos de entrada usando CString () e possui a opção Unicode ligada (para que os chars padrão sejam "wchar_t"). A razão para isso (eu acho, o projeto foi iniciado por outra pessoa) é que alguns dos nomes de arquivos de 'entrada' poderiam conter Charaters Unicode (por exemplo, Japão ou caracteres árabes).
Por exemplo, o caminho do arquivo é algo como "d: docs audio_test stragechar ڝ aqui.mp3", mas eu o entendo:
CString fpath = tmpFile->GetFilePath();
Agora .. se eu tentar fazer:
TagLib::FileRef f(fpath.GetBuffer(0));
fpath.ReleaseBuffer();
Eu recebo algo como:
Símbolo externo não resolvido "__declspec (dllimport) public: __thiscall taglib :: filename :: filename (wchar_t const *)"
Se eu tentar algo como:
TagLib::FileRef f(reinterpret_cast<char*>(fpath.GetBuffer(0)));
fpath.ReleaseBuffer();
Eu me livro dos erros de compilação, mas "F" é um ponteiro/objeto inválido. E quando tento ler uma tag, recebo uma afirmação falhada.
Então, alguém pode me dar algumas dicas sobre como devo passar por esse cString, em sua forma unicode, para o Taglib ?
Atualizar: Endereço Taglib: http://developer.kde.org/~wheeler/taglib.html
Obrigada,
Alex
Solução
Perdi algo essencial quando li sua postagem, então aqui está outra resposta nova e aprimorada:
O erro vem do vinculador, não do compilador. Parece assim que Taglib :: FileName faz ter um CTOR tomando wchar_t const*
, mas o problema é que você não se vincula à biblioteca implementando -o ou vincular uma versão da biblioteca que não a inclui.
IIUC, esta biblioteca vem do mundo Linux (onde os nomes de arquivos são expressos como char
matrizes) e foi posteriormente portado para o Windows (onde os nomes de arquivos são expressos como wchar_t
matrizes). O nome do arquivo ctor tomando um wchar_t
A matriz é, portanto, provavelmente compilada condicionalmente no Windows (ou seja, dentro #ifdef _WIN32
ou algo semelhante), e a biblioteca com a qual você está vinculando (se você está vinculando a biblioteca) não foi compilado com o mesmo pré -processador.
Outras dicas
É possível que o problema seja causado pelo problema descrito aqui. Basicamente, o MSVC tem uma opção para tratar o wchar_t
Digite de maneira diferente, o que causa a biblioteca compilada não é compatível com um aplicativo compilado sem essa opção. Infelizmente, o CMakeLists.txt
o arquivo de construção permite o /Zc:wchar_t-
opção por padrão. Eu tentaria editar o arquivo, remover a opção e recorrer Taglib. Idealmente, a versão 1.6, pois contém muitas correções de bugs.