2009-08-28 10 views
7

Windowsでは、ctypesモジュールをインポートすると、ctypes.cdll.msvcrtオブジェクトが自動的に存在し、 Microsoft C++ランタイムライブラリaccording to the docsを表します。ctypes内のmsvcrtのさまざまなバージョン

しかし、find_msvcrtという機能があることに気がつくと、"return the filename of the VC runtype library used by Python"になります。

それはさらに状態、"If you need to free memory, for example, allocated by an extension module with a call to the free(void *), it is important that you use the function in the same library that allocated the memory."

だから私の質問は、私が既に持っているctypes.cdll.msvcrtライブラリと私はfind_msvcrt機能をロードすることができます1との違いは何でしょうか?特定の状況下では、彼らは同じ図書館ではないでしょうか?

+1

related:[Windows上のPythonでmsvcrtにアクセスする方法の違いは何ですか?](https://stackoverflow.com/q/30790494/4279) – jfs

答えて

10

ctypes.cdll.msvcrtが自動的に存在しますが、ctypes.cdll.anythingが自動的に存在し、最初のアクセス時にロードされます。anything.dll。したがってctypes.cdll.msvcrtはWindowsの一部として出荷されるライブラリであるmsvcrt.dllをロードします。 PythonがリンクするCランタイムではないので、malloc/freeをmsvcrtから呼び出すべきではありません。

たとえば、Python 2.6/3.1では、ctypes.cdll.msvcr90を使用しているはずです。これは時間の経過とともに変化するため、find_msvcrt()は実際に使用するライブラリの名前を返します(そしてctypes.CDLLをロードします)。

MSC、VC++、プラットフォームSDK、またはWindowsの一部としてリリースされたいくつかの異なるバージョンのMicrosoft CRTの名前は次のとおりです。crtdll.dll、msvcrt.dll、msvcrt4.dll、msvcr70。 dll、msvcr71.dll、msvcr80.dll、msvcr90.dll。

+0

ありがとう!私はWindows-landでプログラミングに多くの時間を費やしていないので、この種の詳細は非常に役に立ちます。 –

+4

完全性のために - ctypes.cdll [ctypes.util.find_msvcrt()]は、適切なCRTのハンドルを返す必要があります。 –

関連する問題