Pythonでctypesを通じてエクスポートされたC++関数を呼び出すと、アクセス違反が発生します。エクスポートされた.exe関数にアクセスすると、Pythonのctypesアクセス違反が発生する
:(VSでデバッグするときを示し、同じエラー)私は次のエラーを取得する機能を呼び出すとき(vs2017上でコンパイル)#include <cstdio>
__declspec(dllexport) void x()
{
FILE* out = stdout; // After debugging, this is where the access violation happens.
}
:
は、私は次のCまで++関数を、問題を狭め
Pythonコード:
ctypes.windll.<exe_name>.x()
エラー:
OSError: exception: access violation writing 0x_some_address
重要な点は、上記がEXEとしてコンパイルされていることです。 、私はDLLとして上記をコンパイルしようとした。この上でいくつかの時間を費やして、すべてを試した後
は
(私は「メイン」のエントリポイントを呼び出す関数をエクスポートしたときに全部が始まっ)、今では期待通りに働いています。
問題は、誰かが私にこの問題の原因を説明することができますか?
私は(多かれ少なかれ)メモリ管理の違いを認識していますが、詳細は認識していません。
ありがとうございました。
を言っています'ctypes'を使って' .exe'を呼び出そうとしましたか?エラーが発生したPythonコードを表示してください。また、関数のエクスポートと 'main'を呼び出す関数コードを表示してください。 – cdarke
pyコードが追加されました。 関数のエクスポートが表示されます。これはvsなので、dllexportはvtableにそれを追加するものです。 mainを呼び出す関数は無関係です。問題を簡潔に示し、結果を再現するのに必要なすべての情報がここにあります。私はいくつかの背景のためにそれを言いました。 –
'dllexport'はvtableとは関係ありません。 vtableは、仮想関数をサポートするために使用されるC++固有のデバイスであり、VS以外の実装で使用されます。 'dllexport'は関数名をDLLのエクスポートテーブルに格納します。これはWindows固有のもので、Cプログラムでも使用されます。 DLLで、あなたは 'DllMain()'関数を持っていましたか? – cdarke