【发布时间】:2015-01-13 20:33:35
【问题描述】:
我目前正在开发一个 mac 应用程序,用于将文件从 mac 传输到 mtp 设备,例如 usb。
我使用下面的代码来添加它:
LIBMTP_file_t *genfile;
char *AbsolutePath = NULL;
char *FileNameOnly = NULL;
QFileInfo fileInfo(filename);
FileNameOnly = convertQStr2char(fileInfo.fileName());
AbsolutePath = convertQStr2char(fileInfo.absoluteFilePath());
genfile = LIBMTP_new_file_t();
genfile->filesize = filesize;
genfile->filename = FileNameOnly;
genfile->filetype = file_type;
genfile->parent_id = CurrentFolderID;
genfile->storage_id = PulsDeviceMngr->devicestorage->id;
if ((genfile->filetype != LIBMTP_FILETYPE_ALBUM) && (genfile->filetype != LIBMTP_FILETYPE_PLAYLIST)) {
ret = LIBMTP_Send_File_From_File(PulsDeviceMngr->device, AbsolutePath, genfile, ProgressBar, NULL);
if (ret != 0) {
qDebug() << "Error sending file";
LIBMTP_Dump_Errorstack(PulsDeviceMngr->device);
LIBMTP_Clear_Errorstack(PulsDeviceMngr->device);
} else {
PulsDeviceMngr->devicestorage->FreeSpaceInBytes -= filesize;
PulsDeviceMngr->devicestorage->FreeSpaceInObjects--;
}
}
LIBMTP_destroy_file_t(genfile);
这基本上是 mtp 使其工作所需的。
我正在使用 QT/C++ 开发软件。
似乎 QString 没有受到影响,而只是 char 。需要char,因为使用的api只支持char。我正在使用以下代码将 QString 转换为 char。
char *mtp_wrapper::convertQStr2char(QString str) {
QByteArray latin_str = str.toLatin1();
char *return_str = latin_str.data();
return return_str;
}
-
我在发布 genfile 时遇到问题??似乎运行时认为我无法释放未分配的指针,但我使用以下行来执行此操作:
genfile = LIBMTP_new_file_t(); LIBMTP_destroy_file_t(genfile);
没有先决条件。当 genfile 发生时,销毁发生了。一些数据分配在 genfile 上。
- 我现在可以打开文件以显示 PTP stat 抱怨我无法发送对象
有什么想法吗?
【问题讨论】:
-
QByteArray(filename_stripped).data();返回的指针立即失效,所以你的程序是未定义的。使用变量,而不是临时对象。 -
我做了一些改变。但为什么它变得无效?
-
它变得无效,因为拥有它指向的数据的
QByteArray对象在你将指针分配给任何东西之前就被破坏了。