2017-08-26 21 views
0

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として上記をコンパイルしようとした。この上でいくつかの時間を費やして、すべてを試した後


(私は「メイン」のエントリポイントを呼び出す関数をエクスポートしたときに全部が始まっ)、今では期待通りに働いています。

問題は、誰かが私にこの問題の原因を説明することができますか?
私は(多かれ少なかれ)メモリ管理の違いを認識していますが、詳細は認識していません。

ありがとうございました。

+0

を言っています'ctypes'を使って' .exe'を呼び出そうとしましたか?エラーが発生したPythonコードを表示してください。また、関数のエクスポートと 'main'を呼び出す関数コードを表示してください。 – cdarke

+0

pyコードが追加されました。 関数のエクスポートが表示されます。これはvsなので、dllexportはvtableにそれを追加するものです。 mainを呼び出す関数は無関係です。問題を簡潔に示し、結果を再現するのに必要なすべての情報がここにあります。私はいくつかの背景のためにそれを言いました。 –

+0

'dllexport'はvtableとは関係ありません。 vtableは、仮想関数をサポートするために使用されるC++固有のデバイスであり、VS以外の実装で使用されます。 'dllexport'は関数名をDLLのエクスポートテーブルに格納します。これはWindows固有のもので、Cプログラムでも使用されます。 DLLで、あなたは 'DllMain()'関数を持っていましたか? – cdarke

答えて

1

この記事では、十分な背景情報と、この問題のために可能な解決策を与えているようだ: https://www.codeproject.com/Articles/1045674/Load-EXE-as-DLL-Mission-Possible

主な違いは、DLLとしてEXEをロードするのですが、次のとおりです。あなたがいることを

  • The CRT is not initialized, including any global variables, and
  • The Import Address Table is not correctly configured, which means that all calls to imported functions will crash.
+0

言い換えれば、DLLとしてビルドしてください。^) –

+0

質問は既に出ています。その解決策が分かっていましたが、違いの説明を求めていました。 –

+0

私はそれを動作させる複雑さについてコメントしていました。 –

関連する問題