2016-10-17 6 views
1

最近、コピーと貼り付けにカスタムのMIMEタイプを使用するアプリケーションを作成しました。QT C++カスタムmime-typeを複数のアプリケーションでコピー&ペーストすることはできますか?

私はQt 5.7.0でvs2015を使用しています。 1つのアプリケーションで

、コピー&ペーストがうまく機能し、

が、私はA.EXEとA'.exe(同じコードで構築された同じアプリケーション)、

カスタムMIMEタイプとqclipboardを実行しますA.exeとA'.exeの間で正しく動作しません。

それ以外の場合は、個々のアプリケーションの機能がうまく動作します。

A.exeにデータをコピーしてA'.exeに貼り付けると、カスタムMimedataはNULLになります。

QbyteArrayを使用せずにこの問題を解決する方法はありますか?

以下は私の機能です。

コピー:

QClipboard* _clipboard = QApplication::clipboard(); 

mycustomMimedata* _Mimedata = new mycustomMimedata(); 

_clipboard->setMimeData(_Mimedata); 

ペースト:

QClipboard* _clipboard = QApplication::clipboard(); 

const mycustomMimedata* _mimeData = 
qobject_cast<const mycustomMimedata*>(_clipboard->mimeData()); 

答えて

1

あなたはそれを作成するプロセスによって所有されて割り当てるメモリ。それ以外のプロセスはアクセスできません。ここには2つの異なるプロセスがあります。

mycustomMimedataを割り当ててmime-dataに格納すると、実際にはmimeデータにポインタが格納されます。これは、アプリケーションA.exeにアドレス5(乱数のみ)を持っている可能性があります。

もう1つのアプリケーションには独自のメモリがあり、アドレス5には何もないかもしれません。だからあなたが「ペースト」すると「メモリアドレス5から何かを取得してください」と言って、Qtはこれが有効でないことを知るのに十分にスマートに見えて、あなたにヌルポインタを与えます。


考えられる解決策:

あなただけの「コピー」を必要とする場合は、クラスがシリアライズ可能とMIME値としてこのデータを設定し、ペースト操作でそれをデシリアライズすることができます。または、データベースからロードする場合、IDを使用して、他のアプリケーションでオブジェクトをリロードします。

QByteArrayにデータをコピーすると、POD以外のタイプがあると危険です。それがPODならば保存する必要があります。

両方のアプリケーションで同じインスタンスを操作する必要がある場合は、IPCとshared_memoryに入る必要があります。幸いなことにQtも実装されています。この答えは広すぎるかもしれませんが、Qtには良い文書と例があります。http://doc.qt.io/qt-5/qtcore-ipc-sharedmemory-example.html

+0

ありがとうHayt。私はあなたの提案を試みます。 –

関連する問題