혁신적이면서 상당히 광범위하고 간간히 전문적인 상식과 진실에 기초한 정신과 이노의 본격 아나키 블로그

Posted
Filed under 이노/Programmings
최근 AWS Gateway기능을 써볼 기회가 생겼는데 Indy에서 접속이 되지 않는 문제가 발생했다.
Delphi의 RestClient, NetClient는 정상적으로 접속되는데 유독 Indy만 접속되지 않는 상황.
소스를 따라가보니 RestClient는 NetClient를 베이스로 쓰는것 같고 NetClient는 Windows의 SSL기능을 그대로 가져다 쓰는 것 같다.
설치된 Client가 WindowsXP가 아직도 많고 SP3가 설치되었다고 가정할 수도 없는 상황에서 API Gateway는 조만간 SSLv3를 버릴 분위기라 TLS1.0은 반드시 지원해야 하는 상황.

OpenSSL이 문제인지 Indy의 버그인지 확인해볼 필요가 있어 OpenSSL라이브러리로 직접 테스트 해 볼 필요가 있다고 판단하여 방법을 찾아보았다.
컴파일된 OpenSSL 바이너리를 구해보면 openssl.exe가 있는데 이 프로그램에서 기능을 지원한다.

openssl s_client -connect localhost:443

정상적으로 접속되는지 확인해 볼 수 있다.

여담)
현재까지 확인된 문제는 SSL Certification에서 Handshake에서 서버쪽에서 hello가 두번 날라온다.
실제로 두번 날라오는지 아니면 OpenSSL에서 잘못 처리하는지는 좀 더 확인이 필요.

2016.07.28 추가함
문제는 Server Name Indication 이슈였음. 결국 SSLv3를 지원한다고 하는데 SNI는 TLS의 선택사항이기 때문에 SSLv3는 지원되지 않는다고 보는 것이 정신건강상 좋을 것 같다.
2016/07/27 10:30 2016/07/27 10:30
Posted
Filed under 이노/Programmings

스크린 정보를 찾아보려고 C++ 하던 버릇대로 GetsystemMetrix부터 뒤져보다가 우연히 발견
그래 이런건 클래스로 지원해줘야지


procedure TfrmMonitorTestMain.btnMonitorClick(Sender: TObject);

var
  Screen : TScreen;
  Monitor : TMonitor;
  I : Integer;

begin
  Screen := TScreen.Create(Self);
  try
    for I := 0 to Screen.MonitorCount -1 do
    begin
      Monitor := Screen.Monitors[I];
      mmInfo.Lines.Add(Format(‘Monitor %d: Primary – %s’, [I, BoolToStr(Monitor.Primary, True)]));
      {
      mmInfo.Lines.Add(Format(#9+ ‘Left: %d’, [Monitor.Left]));
      mmInfo.Lines.Add(Format(#9+ ‘Top: %d’, [Monitor.Top]));
      mmInfo.Lines.Add(Format(#9+ ‘Width: %d’, [Monitor.Width]));
      mmInfo.Lines.Add(Format(#9+ ‘Height: %d’, [Monitor.Height]));
      }
      mmInfo.Lines.Add(Format(#9+ ‘BoundsRect : (%d, %d, %d, %d)’,
        [Monitor.BoundsRect.Left, Monitor.BoundsRect.Top,
         Monitor.BoundsRect.Right, Monitor.BoundsRect.Bottom]));
      mmInfo.Lines.Add(Format(#9+ ‘WorkareaRect: (%d, %d, %d, %d)’,
        [Monitor.WorkareaRect.Left, Monitor.WorkareaRect.Top,
         Monitor.WorkareaRect.Right, Monitor.WorkareaRect.Bottom]));
    end;
  finally
    Screen.Free;
  end;

end;

2016/02/23 10:49 2016/02/23 10:49
Posted
Filed under 이노/Programmings

최근 ESC/POS 포맷을 지원하는 POS용 열전사 프린터를 지원해야 할 일이 있었다.
Serial Port기반으로 AnsiString을 지원하는 매우 단순한 포맷으로 대부분 별 문제가 없었는데 역시나 대부분의 구형포맷이 그렇듯 한글출력에서 문제가 발생했다.

UnicodeString을 기본포맷으로 지원하는 델파이는 AnsiString은 별도 포맷으로 지원하고 있는데(아마도 2009 이후) 별다른 설정을 하지 않으면 OS의 Codepage를 따라간다.
결국 AnsiString으로 선언하여 String을 대입하면 CP949포맷으로 입력되는데 문제는 POS프린터가 CP949가 아닌 euc-kr만을 지원한다는 것.

‘똠‘이나 ‘뷁‘과 같은 euc-kr이 지원하지 않은 문자를 같이 입력하면 프린터가 심하게 깨지면서 출력되는 문제가 발생하여 자료를 찾아보았다.

델파이가 유니코드 기반으로 바뀌면서 새롭게 만들어진 스트링포맷인 AnsiString을 그냥 ASCII기반의 문자열 포맷이라고 생각하는 사람들이 대부분인데 코드를 들여다보면 다국어 처리 및 코드페이지에 대해 많은 고민을 하고 만들어진 포맷이라는 것을 알 수 있다.

기능에 대한 많은 내용들은 Delphi, AnsiString 등으로 검색하면 나오니 각설하고...

완성형만을 지원하는 (확장 완성형말고 그냥 완성형)기기에 출력하기 위해서는 CodePage를 정확히 지정해줘야 한다. 처음에는 euc-kr이 유닉스 포맷이고 표준으로 지정되지 않았기 때문에 지정된 코드페이지가 없는줄 알고 멘붕했으나 MSDN을 뒤지다 보니 euc-kr도 코드페이지가 있다는 사실을 알았다.


type
  EucKrString = type AnsiString(51949);

var
  str : string;
  ansi : EucKrString;

begin
  str := ‘똠방각하’;
  ansi := str;
  ShowMessage(String(ansi) + IntToStr(StringCodePage(ansi)));

end;

출력되지 않는 문자는 ?로 변경되는 것을 볼 수 있다.

2015/11/19 10:36 2015/11/19 10:36
Posted
Filed under 이노/Programmings

MFC 프로젝트가 아닌 코드에서 리소스를 추가하면 가끔 “cannot open include file ‘afxres.h’“란 에러가 나는 경우가 있다.
나의 경우는 드라이버 탬플릿으로 프로젝트를 만들면 이런 에러가 나서 MS가 미친게 아닌가 생각했었는데 검색해보니 해결방법이 있었다.

http://howtofix.pro/vs-2012-fatal-error-rc1015-cannot-open-include-file-afxres-h/

위에 MCF 라이브러리를 까세요. 뭐 이런 얘기는 넘어가고 중간에 보면...

This header is a part of the MFC Library. VS Express edition doesn’t contain MFC. If your project doesn’t use MFC you can safely replace afxres.h with windows.h in your terrain2.rc.

이 헤더는 MFC 라이브러리에 포함되어 있습니다. VS Express 에디션은 MCF가 없지염. 만일 프로젝트에서 MFC를 사용할 수 없으면 windows.h로 afxres.h를 안전하게 대체할 수 있습니다.
(물론 리소스에서 참조할 때 이야기)

잘된다. MFC를 전부 써야할 필요가 없는데 저런 에러가 나면 시도해보시라.

2014/01/09 13:11 2014/01/09 13:11
Posted
Filed under 이노/Programmings
기억력이 미천한지라 백업용으로 작성

KMDF Driver를 사용하기 위해서는 WDFCoInstaller의 설치가 필수적이다.

WDFCoInstaller를 설치하면 내부적으로는 Windows\System32\Drivers폴더에
WdfLdr.sys파일과 WdfMM000.sys파일을 생성하는데 이는 WdfCoInstallerMMmmm.dll에 포함되어 있다.

즉 현재 최신 버전인 WdfCoInstaller01011.dll(1.11)을 설치하면 Wdf01000.sys 파일이 설치된다.

이는 WdfPreDeviceInstall과 WdfPostDeviceInstall함수 둘중 하나에서 실행되는걸로 추정되는데 확인은 못해봤음.

즉 KMDF 드라이버도 WDM 필터 드라이버 등록하는 것처럼 Inf 파일 없이 서비스 등록하고 잡다한 레지스트리 등록을 쿵짝쿵짝해서 설치할 수 있다.
2013/09/24 16:43 2013/09/24 16:43