(질문수정)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()
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력