본문 바로가기

Delphi Tip243

DLL(Dynamic-link library)란 (5) DLL(Dynamic-link library)란 (4) 델파이에서의 DLL 작성은 그것을 이용하기 만큼이나 쉽다. 일반적인 코딩 스타일 을 그대로 유지하면 되기 때문이다. 하나의 차이점이라면 프로젝트 파일에서 program 대신 library를 기입하는 것이다. 그에 더해 exports절만 살짝 넣어주면 된다. 물론 우리가 일반적으로 사용하는 VCL하의 프로젝트 구조와는 약간 차이가 있지만, 콘솔(커맨드라인) 프로그램을 작성하는 경우 이런 형태가 일반적이다. 아래 형태의 프로젝트 내용이 이상하게 보이는 사람은 그냥 '정통 스타일의 파스 칼 구조'라고 보면 된다. 물론 반드시 '특정 구조로 작성하라'라는 규칙은 없다. library MinMax; // program 대신 library를 기입한다. func.. 2023. 6. 27.
DLL(Dynamic-link library)란 (4) DLL(Dynamic-link library)란 (4) DLL의 procedure나 function을 어디에서 import할 것인가? 물론, 그것을 사용하 는 unit 내에서 import할 수도 있다. 하지만 대부분의 경우, 개별 unit을 구성하고 그곳에 한 DLL내의 procedure나 function을 import하기 위한 코드를 모두 몰 아넣는 것이 일반적이다. 이렇게 DLL의 import를 목적으로 구성된 unit이 Import Unit이다. import unit의 좋은 예는 '{DELPHI}\Source\RTL\Win' 내의 unit들이다. 이것들은 모두 Windows API를 지원하기 위해 각 DLL별로 만들어진 모든 unit 의 소스가 있다. 이 unit들, 특히 Windows.pas를 자.. 2023. 6. 26.
DLL(Dynamic-link library)란 (3) DLL(Dynamic-link library)란 (3) 윈도우즈가 실행파일을 구동시키는 과정을 살펴보자. 이것은 Windows 95나 Windows NT등의 WIN32에 국한되는 설명이다. *.EXE 형태의 프로그램이 로딩된다면 우선 커널 프로세스 하나가 생성되어 작동한다. 커널 프로세서의 주 역할은 메모리 영역을 구성하는 것이다. 커널 프로세스가 억세스할 수 있는 메모리 범위 는 32bit 범위, 즉 4기가 바이트에 이른다. 다음으로 커널파일매핑 프로세스가 생성되어 작동한다. 이 프로세스는 실행파일을 하드디스크등의 저장소로부터 커널 프로세스의 메모리 영역으로 복사한다. 이 과정을 통해 실행파일은 실제의 어드레스로 매핑된다. 다음으로 프로그램이 DLL을 이용하고 있다면 이 DLL을 찾아 시스템을 뒤진다... 2023. 6. 23.
DLL(Dynamic-link library)란 (2) DLL(Dynamic-link library)란 (2) DLL은 Dynamic-link library의 약자로 한마디로 표현하자면 동적으로 연결되는 램상주 라이브러리이다. Windows 환경하의 프로그래밍에서 DLL은 단순한 라이브 러리 이상의 의미를 가진다. 우리가 작성한 어플리케이션은 DLL의 징검다리를 뛰 어다닌다. Windows의 많은 부분이 DLL로 구성된 탓이다. Windows의 커널, 그래픽 인터페이스, 디바이스 드라이버등은 모두 DLL로 구성되어 있다. 실제로 Windows 하의 프로그래밍 환경에서 DLL과 완전히 별개인 어플리케이션은 존재할 수 없다. 우리가 Windows API가 DLL을 호출하는 것은 당연한 것이라 치고, VCL 역시 DLL 위에서 구성된 것이다. 심지어 DLL이 깨어.. 2023. 6. 22.
DLL(Dynamic-link library)란 (1) DLL(Dynamic-link library)란 (1) DLL은 단지 procedure와 function만을 외부에 제공할 수 있다. DLL이 procedure 나 function의 연결점을 외부에 제공하는 것을 export라고 한다. 실행파일에서 DLL의 procedure나 function의 연결점에 연결하는 것은 import라고 부른다. DLL 을 이용하기 위해서는 반드시 DLL의 export된 procedure나 fuction중 사용하고자 하는 것을 import하여야 한다. import는 아주 간단하다. 일반 procedure나 function의 선언에서 stdcall, external, name등의 키워드들을 추가로 사용하면 그만이다. 예를들어, Windows API중 "user32.dll"에 들.. 2023. 6. 21.
SendMessage 함수를 활용한 윈도우 메시지 전송 방법 델파이에서 SendMessage 함수를 활용한 윈도우 메시지 전송 방법 SendMessage 함수는 다른 윈도우로 메시지를 전송하여 효과적인 통신을 가능하게 해줍니다. SendMessage SendMessage 함수는 지정된 윈도우로 메시지를 보내는 역할을 합니다. 이 함수는 윈도우의 핸들, 전송할 메시지, 메시지 매개변수 및 메시지 데이터를 인자로 받습니다. 메시지를 보내면 수신측 윈도우의 메시지 처리기(Window Procedure)가 호출되어 해당 메시지를 처리합니다. [델파이에서 SendMessage 함수 사용하기] 델파이에서는 WinAPI를 사용하여 SendMessage 함수를 호출할 수 있습니다. 다음은 SendMessage 함수를 활용하여 다른 윈도우로 메시지를 보내는 예제입니다 const .. 2023. 6. 16.
윈도우즈 GUI 기본 폰트정보 구하기 윈도우즈 GUI 기본 폰트정보 구하기 // 다국어 프로그램 만들때 사용해 보세요 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; type TCharSetRec = packed record Name: String; ID: Integer end; con.. 2023. 6. 7.
메모 프린터 기타 방안 #1 uses Printers; procedure TForm1.Button1Click(Sender: TObject); var ScaleX, ScaleY: Integer; RR: TRect; begin with Printer do begin BeginDoc; // The StartDoc function starts a print job. try ScaleX := GetDeviceCaps(Handle, logPixelsX) div PixelsPerInch; ScaleY := GetDeviceCaps(Handle, logPixelsY) div PixelsPerInch; // Retrieves information about the Pixels per Inch of the Printer. RR := Rec.. 2022. 6. 29.
델파이 엑셀(Excel) 수식 포함 저장하기 델파이 엑셀(Excel) 수식 포함 저장하기 uses .., ComObj; procedure TForm1.Button2Click(Sender: TObject); var ExcelObj : OleVariant; WorkBook : OleVariant; WorkSheet : OleVariant; begin ExcelObj := CreateOLEObject('Excel.Application'); ExcelObj.DisplayAlerts := False; WorkBook := ExcelObj.Workbooks.Add; //통합문서를 생성합니다. WorkSheet := WorkBook.WorkSheets[1]; //Sheet를 선택합니다. //엑셀에 데이터를 입력합니다. WorkSheet.Cells[1, 1].V.. 2022. 4. 18.
MessageBox와 MessageDlg의 차이점 MessageBox와 MessageDlg의 차이점 procedure TForm1.Button1Click(Sender: TObject); begin nID := MessageDlg('1234567', mtCustom, [mbOK, mbCancel], 0); nID := MessageBox(0, '1234567', '123455', MB_OKCANCEL); end; 이와 같은 코드가 있을 때 MessageBox는 Message창이 정상적으로 닫힌다. 하지만, MessageDlg나 ShowMessage는 Message창이 닫히질 않는다. 하물며, ModalResult도 반환도 하지 않는다. MessageBox의 모달과 MessageDlg의 모달이 차이점이 과연 멀까? procedure TForm1.Button.. 2022. 4. 15.
Windows PC보호 해결방법 전자서명 후 배포 Windows PC보호 해결방법 전자서명 후 배포 이번에 리멤버 Windows 데스크톱 버전을 개발하면서 처음으로 exe 파일로 설치 파일을 만들고 웹에 배포해 보았습니다. 이 글에서는 처음으로 설치 파일을 웹에 배포하는 과정 그리고 예상하지 못했던 난관에 대하여 설명해보려 합니다. 앱 개발을 완성하고 설치 파일까지 만들었다고 모든 것이 끝났다고 생각하시면 안됩니다. 별 생각 없이 설치 파일을 웹에 게시하고 웹페이지에서 다운을 받으면 다음과 같은 화면들을 만나게 됩니다. 만약 사용자들이 이런 메시지를 본다면 기껏 열심히 만들어 놓은 앱이 악성 프로그램 취급받게 될 것입니다. 자, 앱 개발은 끝났을 지라도 앱 배포는 이제부터 시작입니다. 이 배포에 걸리는 시간은 생각하는 것보다 오래 걸립니다. 전자 서명 .. 2022. 4. 14.
델파이 컴파일러 지시어 {$IFDEF} 델파이 컴파일러 지시어 {$IFDEF} 사용방법 { $ IfDef Symbol} ... 기호가 정의되었을 때 실행할 코드 ... { $ Else } ... 기호가 정의되지 않았을 때 실행할 코드 ... { $ EndIf } 테스트 코딩 procedure TForm1.Button1Click(Sender: TObject); var text : string; begin // Set our code into test mode {$Define TESTMODE} text := 'We are in test mode'; // Display the value of text if we are in test mode {$IfDef TESTMODE} ShowMessage('text = '+text); {$EndIf} // S.. 2022. 4. 12.
프로그램간 메세지 전송 프로그램간 메세지 전송 1. 개요 - 독립된 다른 응용 프로그램간의 메시지 교환을 통해 프로그램을 제어 해 본다. 2. 처리 방법 - Windows의 메시지인 WM_COPYDATA 를 이용한다. - 데이터 교환을 위해 CopyDataStruct 구조체를 이용한다. - SendMessage API를 이용한다. 가. 메시지를 교환 하고자 하는 델파이 프로젝트 양쪽의 유닛에 messages 를 Uses 절에 추가한다. 나. 메시지를 보내는 쪽 Unit - 메시지를 받을 응용 프로그램의 핸들을 얻는다. (FindWindow 이용) - CopyDataStruct 구조체에 보낼 정보를 채운다. - SendMessage를 이용해 받는쪽 윈도우 핸들에 WM_CopyData 메시지를 CopyDataStruct 구조체와 .. 2022. 4. 11.
윈도우 종료(재시작) 3가지 방법 윈도우 종료(재시작) 3가지 방법 Title: Shutdown Computer by 3 Solution Question: how i can shutdown computer in windows NT family? Answer: // ALI EBRAHIMI DORCHEH (ebr_ali@yahoo.com) //------------- Solution 1----------------- procedure TForm1.Button1Click(Sender: TObject); begin ExitWindowsEx(EWX_FORCE and EWX_SHUTDOWN,0); //EWX_SHUTDOWN for shutdown //EWX_REBOOT for reboot //EWX_LOGOFF for logoff end; //--.. 2022. 4. 5.
실행파일명으로 프로세스(TASK) 죽이기 실행파일명으로 프로세스(TASK) 죽이기 function KillTask(ExeFileName: string): Integer; const PROCESS_TERMINATE = $0001; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin Result := 0; FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while.. 2022. 3. 31.
레지스트리 읽고 쓰기 레지스트리 읽고 쓰기 uses Registry < 추가 var Reg :TRegistry; RString : String; Begin // 읽기 Reg := TRegistry.Create; Reg.RootKey := HKEY_LOCAL_MACHINE; // Root Reg.OpenKey(`\Software\AhnLab\V3Lite\`,True); RString := Reg.ReadString(`InstallPath`); Reg.Free; ShowMessage(RString); // 쓰기 Reg := TRegistry.Create; Reg.RootKey := HKEY_LOCAL_MACHINE; // Root Reg.OpenKey(`\Software\AhnLab\V3Lite\`,True); Reg.Write.. 2022. 3. 29.
윈도우버전별 바탕화면 경로 알아내기 윈도우버전별 바탕화면 경로 알아내기 uses ShFolder,ShlObj; function GetSystemDirectory(Dir: Integer): String; var Path: PChar; begin Result:=''; GetMem(Path, MAX_PATH); SHGetFolderPath(0, Dir, 0, 0, Path); Result:=Copy(Path, 0, Length(Path)); FreeMem(Path); end; 사용 예제 var path : String begin path := GetSystemDirectory(CSIDL_PROFILE); end; --------------------------------------------------------------------------.. 2022. 3. 28.
윈도우 화면보호기 상태확인 윈도우 화면보호기 상태확인 function IsWorkstationLocked: Boolean; var hDesktop: HDESK; begin Result := False; hDesktop := OpenDesktop('default', 0, False,DESKTOP_SWITCHDESKTOP); if hDesktop 0 then begin Result := not SwitchDesktop(hDesktop); CloseDesktop(hDesktop); end; end; 2022. 3. 25.
Delphi Tip Delphi Tip 임시 스트링 리스트 사용 임시 스트링 리스트를 사용하는 것이 어떤경우 훨씬 빠른 결과를 나타낼 수 있다. ListBox1.Clear; Ini := TIniFile.Create('win.ini'); ReadSection('Colors', ListBox1.Items); Ini.Free; 위와같이 하는 대신에 이렇게 해 보자. StrList := TStringList.Create; ListBox1.Clear; Ini := TIniFile.Create('win.ini'); ReadSection('Colors', StrList); Ini.Free; ListBox1.Items.Assign(StrList); StrList.Free 리소스로부터 비트맵 로드 MyBitmap.Handle := Load.. 2022. 3. 24.
안드로이드에서 MessagDlg 사용방법(주의 점) 안드로이드에서 MessagDlg 사용방법(주의 점) Blockin dialogs not implemented on this platform. ❑ 원인 안드로이드에서는 블로킹 대화상자를 지원하지 않습니다. 하지만 컴파일 시 오류가 나지 않기 때문에 구현 시 주의가 필요합니다. ❑ 해결방안 ACloseDialogProc 파라메터가 있는 MessageDlg 함수를 이용해야 합니다. ACloseDialogProc은 MessageDlg에서 버튼을 누른 이후의 동작을 가진 익명메소드 입니다. 아래 예제를 참고하세요. unit uMain; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.T.. 2022. 3. 11.