kkuzil.own@gmail.com

Posted
Filed under Development/Delphi
.EXE 파일의 리소스를 열고 고치고 싶어서...


LoadLibrary(..)  > FindResource() > SizeOfResource() > LoadResource() > LockResource() >
FreeLibrary() > BeginUpdateResource() > UpdateResource() > EndUpdateResource()

뭐 이런 절차로 하려고 하는데 아무리해도 UpdateResource() 여기서 적용이 안되는거다..
GetLastError()를 찍어봐도 문제가 없고...! LoadResource(), LockResource() 이걸로 리소스도 잘 가져오는데!
아놔~! 뭐가 문젠지 한참을 고민하다 보니,

LoadLibrary([Path]) > FreeLibrary() 이렇게 하고 구동한 프로그램이 종료될때까지 [Path]가 제대로 지워지지

않는 문제가 있는거다.
원인은... LoadLibrary([Path]) 이거다. 요넘은.. .

LoadLibrary([Path])  이렇게 열면... 열어서 쓰는거 까지 좋은데 FreeLibrary() 이걸로 잘(?) 안닫힌다.

이 후에 수정작업은 먹통이되버린다. (UpdateResource()등등)

.DLL만 잘 불러오게 하는 그런게(?) 있나부다.
msdn에는 .EXE에는 쓰지마라 이런말은 없고 블라블라~~

암튼, 요렇게 하면 된다.

hModule := LoadLibraryEx([Path], 0, LOAD_LIBRARY_AS_DATAFILE);

....
....
FreeLibrary(hModule)

이렇게 하면 해제 잘되서 이 후에 리소스 수정작업도 잘된다~

끝.
2012/10/04 22:10 2012/10/04 22:10
Posted
Filed under Development/Delphi

function GetWndHandleFromPID(dwPID: DWORD): HWND;
var
  h: HWND;
  dwCheckPID: DWORD;
begin
  Result := 0;
  h:= FindWindow(nil, nil);
  while h <> 0  do
  begin
    if GetParent(h) = 0 then
    begin // 최상위 핸들 체크 (컨트롤 무시)
      GetWindowThreadProcessId(h, @dwCheckPID);
      if dwCheckPID = dwPID then
      begin
        Result := h;
        exit;
      end;
    end;
    h:= GetWindow(h, GW_HWNDNEXT);
  end;
end;
2012/09/21 16:44 2012/09/21 16:44
Posted
Filed under Development/Delphi

  PEntry = ^TEntry;
  TEntry = packed record
    case Integer of
    0 : (Head: TEntryHead);
    1 : (Data: array [0..511] of AnsiChar);
  end;
이런 구조체가 있을때,
...
..

var
  e: TEntry;
begin
  ReadData(...., ...., @e);
end;

이 경우 포인터가 잘못 되었다는 메시지가 뜨면서 에러가 발생한다.
코드상.. 아무런 잘못도 없는거 같아서..
ReadData(...., ...., @e.Data[0]);

머 이렇게 해도 안되고..

그래도 계속 트라이 하는중에 알아냈다.

 TEntry = packed record

여기서 packed  빼 주니깐 된다는..

기본 바이트 정렬을 사용하지 않고 packed를 해주면
컴파일러가 내부 포인터를 어떻게 써야하는지 헷갈리나보다..

아무튼 다음에도 이런문제가 생기면 기억나도록 이렇게 기록함.
2012/07/31 16:00 2012/07/31 16:00
Posted
Filed under Development/Delphi

1. 우리나라 날짜 포맷
ShortDateFormat := 'YYYY-MM-DD';
DateSeparator   := '-';

2. 일본 날짜 포맷
ShortDateFormat := 'YYYY/MM/DD';
DateSeparator   := '/';


TimeSeparator := ':';
LongTimeFormat := 'hh:mm:ss';




function StrToDateTimeDef2(const S: string; const Default: TDateTime): TDateTime;
var
FormatSettings: TFormatSettings;
begin
FormatSettings.DateSeparator := '-';
FormatSettings.ShortDateFormat := 'yyyy-mm-dd';
FormatSettings.TimeSeparator := ':';
FormatSettings.LongTimeFormat := 'hh:mm:ss';

if not TryStrToDateTime(S, Result, FormatSettings) then
Result := Default;
end;
2012/05/21 11:17 2012/05/21 11:17