MingW32-64 句柄 Unicode Window DLL
MingW32-64 handle Unicode Window DLLs
我有一个关于QT5和MingW32-64的问题。我得到了一个用 MSVC 编译的 API DLL。这个 DLL 带有一个库,就像在 Windows 上一样。现在用 QT5/MSVC 字完美编译应用程序。但是我们的编译器是MingW32-64。我一直试图向 API DLL 发送一个字符串,但我收到了一个错误。
错误不是很清楚,它说“错误的参数”
然而这是代码:
QString strSavePath = QDir::toNativeSeparators(fileNames.at(0));
#if defined (WIN32)
QString rootPath = "\";
#else
QString rootPath = "/";
#endif
SFileToAdd file;
file.lpszFileName = nullptr;
//Attention, this differ on MAC And Win32
const TCHAR *pSavePath = convertToFoxValue(strSavePath);
const TCHAR *pRootPath = convertToFoxValue(rootPath);
file.lpszSourceFilePath = pSavePath;
file.lpszDestinationPath = pRootPath;
file.bVideoFile = BS_FALSE;
if(ui->usePath->isChecked()==false){
file.nSavePath = BS_DONT_SAVE_PATH;
}else{
file.nSavePath = BS_WHOLE_PATH;
}
int32 res = ::AddFile(file);
if(res!=0){
QMessageBox::information(this, tr("Information"),
tr("Error in AddFile"));
}
delete [] pSavePath;
delete [] pRootPath;
转换函数为:
const TCHAR* convertToFoxValue(const QString& strValue)
{
#if defined (WIN32)
TCHAR *someVar=new TCHAR[strValue.size()+1];
strValue.toWCharArray(someVar);
//set last caharacter to null terminator
someVar[strValue.size()]=L'[=12=]';
return reinterpret_cast<const TCHAR *>(someVar);
#else
TCHAR *someVar=new TCHAR[strValue.size()+1];
QByteArray pass = strValue.toUtf8();
strcpy(someVar,pass.data());
return reinterpret_cast<const TCHAR *>(someVar);
#endif
}
提交硬链接如
file.lpszSourceFilePath = L"D:\datapart.pdf";
file.lpszDestinationPath = L"\";
也不工作。所以我完全混淆了。一切都是用 _UNICODE 标志编译的。
MinGW 和空终止宽字符串有问题吗?或者 MingW 通常使用 UNCIDOE 设置吗?
调用用另一个编译器编译的库不是一个好主意,尤其是在 C++ 中。
如果您想使用 MinGW-w64 的 Qt,那么最好使用具有相同编译器的 Qt 版本。
对于所有遇到同样问题的人。检查有关使用 MSVC 定义的头文件
我是
#ifdef _MSC_VER
#pragma pack(push, 1)
#endif
我改成了
//#ifdef _MSC_VER
//No padding
#ifdef WIN32
#pragma pack(push, 1)
#endif
所以 MingW 现在也知道了结构填充,并且现在工作得很好。 C/C++ DLL 或其他什么都没有。
我有一个关于QT5和MingW32-64的问题。我得到了一个用 MSVC 编译的 API DLL。这个 DLL 带有一个库,就像在 Windows 上一样。现在用 QT5/MSVC 字完美编译应用程序。但是我们的编译器是MingW32-64。我一直试图向 API DLL 发送一个字符串,但我收到了一个错误。 错误不是很清楚,它说“错误的参数”
然而这是代码:
QString strSavePath = QDir::toNativeSeparators(fileNames.at(0));
#if defined (WIN32)
QString rootPath = "\";
#else
QString rootPath = "/";
#endif
SFileToAdd file;
file.lpszFileName = nullptr;
//Attention, this differ on MAC And Win32
const TCHAR *pSavePath = convertToFoxValue(strSavePath);
const TCHAR *pRootPath = convertToFoxValue(rootPath);
file.lpszSourceFilePath = pSavePath;
file.lpszDestinationPath = pRootPath;
file.bVideoFile = BS_FALSE;
if(ui->usePath->isChecked()==false){
file.nSavePath = BS_DONT_SAVE_PATH;
}else{
file.nSavePath = BS_WHOLE_PATH;
}
int32 res = ::AddFile(file);
if(res!=0){
QMessageBox::information(this, tr("Information"),
tr("Error in AddFile"));
}
delete [] pSavePath;
delete [] pRootPath;
转换函数为:
const TCHAR* convertToFoxValue(const QString& strValue)
{
#if defined (WIN32)
TCHAR *someVar=new TCHAR[strValue.size()+1];
strValue.toWCharArray(someVar);
//set last caharacter to null terminator
someVar[strValue.size()]=L'[=12=]';
return reinterpret_cast<const TCHAR *>(someVar);
#else
TCHAR *someVar=new TCHAR[strValue.size()+1];
QByteArray pass = strValue.toUtf8();
strcpy(someVar,pass.data());
return reinterpret_cast<const TCHAR *>(someVar);
#endif
}
提交硬链接如
file.lpszSourceFilePath = L"D:\datapart.pdf";
file.lpszDestinationPath = L"\";
也不工作。所以我完全混淆了。一切都是用 _UNICODE 标志编译的。 MinGW 和空终止宽字符串有问题吗?或者 MingW 通常使用 UNCIDOE 设置吗?
调用用另一个编译器编译的库不是一个好主意,尤其是在 C++ 中。 如果您想使用 MinGW-w64 的 Qt,那么最好使用具有相同编译器的 Qt 版本。
对于所有遇到同样问题的人。检查有关使用 MSVC 定义的头文件 我是
#ifdef _MSC_VER
#pragma pack(push, 1)
#endif
我改成了
//#ifdef _MSC_VER
//No padding
#ifdef WIN32
#pragma pack(push, 1)
#endif
所以 MingW 现在也知道了结构填充,并且现在工作得很好。 C/C++ DLL 或其他什么都没有。