他の同様のエラーを調べてみると、あるべきではないアドレスに書き込むなどの違法な操作に問題があると思います。これを解決する方法がわかりません。何か助けてください?
私が得ている正確なエラー:
in GetSoftwareVersion()
result = f(LCP_Version, FCP_Version)
OSError: exception: access violation writing 0x00000000
私が呼んでいる関数
x = GetSoftWareVersion()
print(x)
GetSoftwareVersion()の内容
def GetSoftwareVersion():
f = shim.GetSoftwareVersion
LCP_Version = ct.c_char_p(0)
FCP_Version = ct.c_char_p(0)
result = f(LCP_Version, FCP_Version)
if result:
print(find_shim_error(result))
return LCP_Version.contents.value, FCP_Version.contents.value
編集:関連するC++コードを追加する
PCSHIMDLL_API error_status_type GetSoftwareVersion(
char* LCP_Version,
char* FCP_Version
)
{
error_status_type return_status = SUCCESS;
string LCP_V("");
string FCP_V("");
LaserIDType_var laserID;
laserID = p_DiagIF->GetLaserID();
LCP_V = laserID->m_LCPSoftwareVersion;
FCP_V = laserID->m_FCPSoftwareVersion;
strcpy(LCP_Version, LCP_V.c_str());
strcpy(FCP_Version, FCP_V.c_str());
return return_status;
}
ステートメントLCP_Version = ct.c_char_p(0)
が原因で、エラーOSError: exception: access violation writing 0x00000000
が発生します。 c_char_p
のctypesドキュメント で示唆されているように、整数アドレスを渡しています。
ctypes
に指示しているのは、char *
を指す新しい0
を作成し、strcpy(LCP_Version, LCP_V.c_str());
を介してstrcpy
にしようとすることです。 ct.c_char_p(1)
を使用する場合は、access violation writing 0x0000001
を取得し、c_char_p(2)
を使用する場合は、0x...2
を取得します。あなたの記憶があなたにその場所への書き込みを許可するべきである、あるいは許可したいと思う可能性は非常に低いので、エラーです。
おそらくやりたいことは、 create_string_buffer(N)
を使用することです。ここで、N
は、LCP_V = laserID->m_LCPSoftwareVersion;
の出力を含むために必要な配列のサイズです。 create_string_buffer
は、その名前が示すように、nullバイトに初期化される可変charバッファーを提供します(たとえば、p = create_string_buffer(3)
はp
がサイズ3で、内容がb'\x00\x00\x00
であることを意味します) 。 p_DiagIF->GetLaserID();
のソースを推測して確認または確認して、N
の安全な値を探し出すか、LCP_Version = ct.c_char_p(50)
のような巨大なもの(バージョン番号の場合)を自分に与えることができます。そこから正気の何かを選びます。