(질문수정)Python ctypes, OSError: exception: access violation reading 000000 오류

조회수 2300회

안녕하십니까. python에서 ctypes 모듈을 사용해 c++로 만든 dll파일을 작동시키는 프로그램을 tkinter로 작성중에 있습니다.

문제점은 아래 오류사항처럼, " access violation reading 0x00000048" 라는 에러가 나는 것입니다. 현재 c_double 형태의 사용은 확인됬는데 c_char_p 형태로 파일위치(Python:str형) 사용은 저런 오류가 자꾸 발생합니다.

코드에 문제가 있는지, 아님 추가해야하는 코드가 있는지 고수분들의 매서운 한말씀 기다립니다.

오류사항

C:/Users/administration/source/repos/Read/Read/test.RAW Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\administration\AppData\Local\Programs\Python\Python37-32\lib\tkinter_init.py", line 1705, in __call_ return self.func(*args) File "C:\Users\administration\source\repos\Read\Read\Read.py", line 65, in clickOK IEEE.main(C.c_double(tole), C.c_char_p(filename.encode('utf-8'))) OSError: exception: access violation reading 0x00000048

python 코드

import tkinter as tk
from tkinter import filedialog, ttk, Menu
import ctypes as C
import tkinter.scrolledtext as tkst
from ctypes.util import find_library
from ctypes import *

filename = ""

#파일 열기 함수
def openfile():
    filename = filedialog.askopenfilename(initialdir = "C:/Users/administration/source/repos/Read/Read", title = "파일을 선택해주세요", filetypes = (('RAW 파일','*.RAW'),('모든 파일',"*.*"))) #filename = 파일의 경로
    class foo(C.Structure):
     _fields_=[(filename,c_char_p)]


#계산 버튼 함수, 여기서 문제가 발생합니다.
def clickOK():

         IEEE = C.CDLL('IEEE')
         tole = 0.00005
         c_main = IEEE['main']
         IEEE.main.argtypes = [C.c_double,C.c_char_p]
         IEEE.main(C.c_double(tole), C.c_char_p(filename.encode('utf-8')))  
    #문제의 부분입니다.
         txt = open("IEEE result.txt", 'r')
         data = txt.read()
         scrt.insert(tk.INSERT, data)                   
         scrt.see(tk.END)

#이 밑부분은 기초설정이라 문제될 부분은 없습니다. 

if __name__ == '__main__':
    #제목과 사이즈
    win = tk.Tk()
    win.title("Power Flow Simulator")
    win.resizable(True, True)
    #win.geometry("600x400+200+200")                     

    #내부 라벨
    labelGender = ttk.Label(win, text="Method:")   
    labelGender.grid(column=0, row=0)               
    labelMargin = ttk.Label(win, text="tolerance:")         
    labelMargin.grid(column=1, row=0)                  

    #Method 형식
    Method = tk.StringVar()                                         
    MethodCombo = ttk.Combobox(win, width=20, textvariable=Method)   
    MethodCombo['values'] = ("Gauss-Seidel method", "Newton-Raphson method")                      
    MethodCombo.grid(column=0, row=1)
    MethodCombo.current(0)

    #Margin 형식
    Margin = tk.IntVar()                                       
    MarginEntered = ttk.Entry(win, width=20, textvariable=Margin)  
    MarginEntered.grid(column=1, row=1)

    #계산 버튼
    action = ttk.Button(win, text="Calculate", command=clickOK)    
    action.grid(column=2, row=1)

    #계산 내용창
    scrt = tkst.ScrolledText(win, width=75, height=15, wrap=tk.WORD)
    scrt.grid(column=0, row=2, columnspan=3)
    scrt.focus_set()                                                

#메뉴창 형식, 파일
menu_bar = Menu(win)
file_menu = Menu(menu_bar, tearoff = 0)
file_menu.add_command(label = '파일 열기', command = openfile)
file_menu.add_separator()
file_menu.add_command(label = '종료', command = win.quit)
menu_bar.add_cascade(label = '파일', menu = file_menu)

#메뉴창 형식, 도움말
file_menu2 = Menu(menu_bar, tearoff = 0)
file_menu.add_separator()
file_menu2.add_command(label = '정보')
menu_bar.add_cascade(label = '도움말', menu = file_menu2)
win.config(menu = menu_bar)

tk.mainloop()
  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 제공하신 코드로는 오류 원인을 알 수 없습니다.

    일단 python 코드는 ctypes 관련 코드로만 추려서 제공하고 c/c++ 코드도 봐야 합니다. 특히 extern C로 했는지 확인해야 합니다. 또한 CDLL 을 사용했는데 윈도우에서 dll은 보통 stdcall 로 작성하게 됩니다. 즉 콜링 컨벤션을 stdcall 로 작성한거라면 windll 을 사용해야 합니다.

    C++ DLL이 공개되어 있는 라이브러리라면 어떤 라이브러리인지 알려주시기 바랍니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)