1

Python の ctypes モジュールを使用して DLL から関数をインポートして使用しようとしていますが、次のエラーが発生し続けます。

Windows Error: exception: access violation writing 0x0000002C

ここで同様のトピックに関する他の質問を見てきましたが、機能する答えを提供できるものはないようです。私の現在のコードは次のとおりです。

from ctypes import *

dll = "./WinlicenseSDK/WinlicenseSDK.dll"

mydll = cdll.LoadLibrary(dll)

name = c_char_p("A.N. Body")
org = c_char_p("ACME")
pcID = c_char_p("APC44567")
zero = c_int(0)
licenseKey = create_string_buffer("")    

mydll.WLGenLicenseFileKey(HASH, name, org, pcID, zero, zero, zero, zero, zero, licenseKey)

コンテキスト: ソフトウェアのライセンス技術を調査しています。上記の関数は、パラメーターをハッシュしてライセンス キーを生成します。

WLGenLicenseFileKey の最後のパラメータは、生成されたキーが書き込まれる文字列バッファです。

関数の argtypes を設定しようとしましたmydll.WLGenLicenseFileKey.argtypes = ...が、文字列、int、float などのように文字列バッファー ctypes の生の型がないため、これは機能しません。

どこが間違っているのか誰にも教えてもらえますか?

編集:

C/C++ 関数定義:

int WLGenLicenseFileKeyW(    
wchar_t* pLicenseHash,     
wchar_t* pUserName,     
wchar_t* pOrganization,    
wchar_t* pCustomData,     
wchar_t* pMachineID,   
int NumDays,    
int NumExec,    
SYSTEMTIME* pExpirationDate,     
int CountryId,     
int Runtime,     
int GlobalTime,    
char* pBufferOut    
);

これが、ドキュメントが関数について提供するすべての情報です。

4

1 に答える 1

3

licenseKey バッファーの長さは 1 バイトで、Unicode 文字列を渡しません。私は自分の PC の前にいるわけではありませんが、パラメーターが正しいと仮定すると、これは近いはずです。関数の W バージョンを呼び出すようにしてください。また、int とポインターである限り、正確な型を作成する必要はありません。

buffer = create_string_buffer(REQUIRED_BUFSIZE)
mydll.WLGenLicenseKeyW(u"A.N. Body", u"ACME", u"APC44567", None, None, 0, 0, None, 0, 0, 0, buffer)

を使用する場合はargtypes、次のようにします。

mydll.WLGenLicenseKeyW.argtypes = [c_wchar_t,c_wchar_t,c_wchar_t,c_wchar_t,c_wchar_t,c_int,c_int,c_void_p,c_int,c_int,c_int,c_char_p]

SYSTEMTIMENULL 以外のものを渡したい場合も定義する必要があります。

編集

私はいくつかのドキュメントを見つけました。関数は stdcall 呼び出し規約を使用するため、次を使用します。

mydll = WinDLL(dll)
于 2012-07-20T07:17:41.123 に答える