0

次のように定義されたコードがあります。

typedef long (*ShellExecFunct)(long, const char*, const char*, long, long, long);

void some_funct()
{
    QLibrary shell32(QString("shell32.dll"));
    ShellExecFunct viewfile = (ShellExecFunct) shell32.resolve("ShellExecuteA");

    if(ビューファイル)
    {
        int res = viewfile(NULL, "open", "c:\\eula.1028.txt", NULL, NULL, 5);
    }
}

このコードは、私が望むようにファイルを起動しますが、すぐに爆発します。新しいウィンドウは開いたままです。

私は次のような別のバージョンを持っています:

typedef long (*ShellExecFunct)(long, const char*, const char*, long, long, long);

void some_funct()
{
    QLibrary shell32(QString("shell32.dll"));
    ShellExecFunct viewfile = (ShellExecFunct) shell32.resolve("ShellExecuteA");

    if(ビューファイル)
    {
        int res = viewfile(NULL, "open", "c:\\eula.1028.txt", NULL, NULL, 5);

        QMessageBox b;
        b.setText(QString::number(res,10));
    }
}

このコードは爆発しません。b.exec() を呼び出す必要さえないことに注意してください。ただし、b.exec() を呼び出すと、値 42 が表示されます。

ここで何がうまくいかないのか、それを修正するために何ができるのか、誰かが私に手がかりを与えることができますか?

ありがとう。

編集:

後世にとって、ここでの前提は間違っています。Qt は、プラットフォーム固有のコードがなくても、私が必要とする正確な機能を提供します。受け入れられた回答をご覧ください。

4

1 に答える 1

2

このように Qt を全体に使用しないのはなぜですか?

QDesktopServices::openUrl(QUrl("file:///c:/eula.1028.txt", QUrl::TolerantMode));

クラッシュが発生する理由については、呼び出し規約の問題である可能性があります。これは推測にすぎませんがWINAPI、関数ポインター型に追加してみてください。しかし、私が言ったように、私はQDesktopServicesこれらのものを直接扱うのではなく、使用するだけです。

このようなもの:

typedef HINSTANCE WINAPI (*ShellExecutePtr)(HWND,LPCSTR,LPCSTR,LPCSTR,LPCSTR,INT);
于 2009-12-09T18:34:27.200 に答える