왜 GetDlgItemFloat 함수는 없나?(Why isn't there a GetDlgItemFloat function?)

"GetDlgItemInt 와 SetDlgItemInt 함수는 있는데, GetDlgItemFloat 와 SetDlgItemFloat 함수는 없는거지요?" 라는 질문을 하는 사람이 있다.
이건... 5달러를 주었더니, 왜 10달러를 주지 않냐? 라고 하는 것과 같은 것 같다.
위 질문의 시작은 결국 "왜 GetDlgItemInt 함수는 있냐?" 에서 시작한다.
GetDlgItemInt 함수는 GetDlgItemText 와 atoi 함수를 이용해서 구현 할 수 있는 곳에 사용하기 위함이 아니다.
다이얼로그 박스 이외의 곳에서 Integer(정수)를 읽어들이는 작업은 거의 일어나지 않고, 개발된 윈도우 컴퍼넌트들을 통해서 많이 일어나게된다. 그래서, 이렇게 2개의 도움이되는 함수(GetDlgItemInt, SetDlgItemInt)들을 만들어 코딩의 양을 줄일수 있는 의미있는 일들에 사용할 수 있게 했다.
그것이 256KB 머신에서라면,(과거 win 3.x 버전) 코딩의 양을 줄이는 것은 아주 큰 의미가 있는 것이 였다.
(GetDlgItemInt 와 SetDlgItemInt 함수는 과거에 설계될 당시 그러한 의미였다는 것이다.)
그렇다면, 왜 floating point 기능은 만들지 않았나?
8080 프로세서 였을때,(설계 당시) floating point 를 프로세서에서 지원하지 않았다. 만약 하드웨어 floating point 지원을 원한다면, 추가로 8087 프로세서를 추가 비용을 들여야만 floating point 에뮬레이터를 추가할 수 있었고, 이 또한 small library(작은 크기)가 아니였다.(덩치가 컸다)
대부분의 프로그램에서 거의 사용하지 않는 두개의 함수를 사용하려면, 윈도우 매니저는 전체 floating point 에뮬레이터를 떠 안아야(로딩 또는 관리) 할 것이다.
"당신은 내가 거의 사용하지 않는 수학 라이브러리(math library)가 소모하는 10% 이상의 메모리를 잘 설명해 줄 수 있나?"
다음으로 집어 보아야 할 관점은
대부분의 컴퓨터 프로그램에서는 floating point 를 이용하지 않는다는 것이다.
과거 10년동안 다이얼로그 박스에서 floating pointer 를 위해서 그 내용을 읽어야 했던 경우는 한번도 없었다.
물론, 당신이 숫자적인(수학적인) 작업을 한다면, 그때는 floating point 가 필요하겠지만, 대부분의 윈도우 프로그램은(Regedit, Notepad 등등(Excel 은 제외)) 필요치 않다.
GetDlgItemFloat 함수를 추가한다는 것은 윈도우 매니저에 floating point 에뮬레이터를 추가해야 한다는 것을 의미한다.(그건 윈도우 매니저를 모욕하는 일이다.) atof 도 마찬가지다.
그래도 만약 GetDlgItemFloat 함수를 원하다면, 원하는 사람이 floating point 지원/floating point 예외처리 로직 등을 직접 구현하면 될 것이다.(그럼, 우리들은 그렇게 구현된 것을 보고 짧은 시간에 무시무시한 floating point 예외처리 로직을 쉽게 배울 수 있을 것이다.)
ps. wsprintf 함수가 왜 floating point 를 지원하지 않는지에 대한 답변도 당연히 위에 것과 같다.
(For a similar reason, the wsprintf function does not support floating point.)
왜? Registry key들은 default value(기본값)를 가지는가?

RegSetValueEx 함수로 Registry key 하위에 named values(이름을 가지는 값들)을 생성할 수 있고, lpValue와 같은 null string 포인터나 NULL 을 가지는 소위 default value(기본값) 또한 가지게 된다.
이 기본값은 RegSetValue와 RegQueryValue 함수롤 호출해서 내부 값을 설정하고 내부 값을 조회할 수 있다.
기본값을 다룬다는 것은 무엇인가?
오리지날 16-bit 레지스트리는 named values(이름을 가지는 값들)을 가지고 있지 않았다.
단지 keys 만 가졌고, 각 key와 연결된(관련된) 단일 데이터(string)로 구성되었다.
이런 데이터를 다루는 함수들인 RegSetValue 와 RegQueryValue 함수는, 왜 lpValue 파라메터를 가지지 않고, 단지 string 데이터만을 설정하고 조회하는지를 설명한다.
영어로는
"Operation must use an updateable query"
프로그램(VC++)를 이용해서 ODBC 형태로 엑셀파일의 정보를 읽는(Select) 예제는 많이 있더군요.
그런데, 엑셀파일에 정보를 입력하는 (update, insert)하는 예제는 없더군요.
그냥, Select 문장을 Insert 문장으로 바꾸고 프로그램을 돌리니깐......
역시나 안되더군요.
에러를 확인해 보니, 위에 보이는 에러내용이 나오네요.
해결 방법을 찾아보니깐,
우리나라 사이트에서는
1. 해당 엑셀파일의 권한을 쓰기 가능하도록 풀어라(모든 유저에서)
2. ASP... 어쩌고 저쩌고..
정도가 적혀 있네요.
그런데... 그렇게 설정을 바꾸었는데도 잘 안되더군요.
구글 검색 했습니다.
거의 정답이 적혀 있더군요.
Excel 파일을 ODBC 를 이용해서 접근할 경우
SQLDriverConnect 함수에 Readonly=0 을 명시하지 않으면,
Default 로 Read-Only 로 한다고 하네요.
wsprintf((char *)InCon,"DRIVER={Microsoft Excel Driver (*.xls)};Readonly=0;DBQ=%s\\Cig.xls",Dir);
Ret=SQLDriverConnect(hDbc,hWndMain,InCon,sizeof(InCon),OutCon,sizeof(OutCon),&cbOutCon, SQL_DRIVER_NOPROMPT);
.....
if (SQLExecDirect(hStmt,(SQLCHAR *)"insert into [Sheet1$](name, price, korean) values ( 'abc', 456789, 0 )",SQL_NTS) != SQL_SUCCESS) {
대충 이렇게 하니깐, 엑셀 Sheet에 자료가 입력되네요.
Prev
Rss Feed