web-dev-qa-db-ja.com

ctypes、python3.5、OSError:例外:0x00000000を書き込むアクセス違反

他の同様のエラーを調べてみると、あるべきではないアドレスに書き込むなどの違法な操作に問題があると思います。これを解決する方法がわかりません。何か助けてください?

私が得ている正確なエラー:

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;
}
7
toshbar

ステートメントLCP_Version = ct.c_char_p(0)が原因で、エラーOSError: exception: access violation writing 0x00000000が発生します。 c_char_pのc​​typesドキュメント で示唆されているように、整数アドレスを渡しています。

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)のような巨大なもの(バージョン番号の場合)を自分に与えることができます。そこから正気の何かを選びます。

6
user559633