WDCC (WMI Delphi Code Creator) 를 이용하자.


http://theroadtodelphi.wordpress.com/wmi-delphi-code-creator/

'Windows > RAD Studio' 카테고리의 다른 글

[DEL] 논리드라이브 클러스터 크기 확인 (Win32)  (0) 2015.04.21
[Del] Compiler Directive  (0) 2014.12.08
[BCB] 관리자 권한 확인  (0) 2013.07.09
[BAT] 관리자 권한 확인  (0) 2013.07.09
enum 값 문자열 출력  (0) 2013.07.05


#include <sddl.h>

bool __fastcall IsAdministratorPrivilege(void)

{

DWORD dwSize;

HANDLE hToken;

PTOKEN_MANDATORY_LABEL ptml;

LPWSTR szSid;


::OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY, &hToken);

::GetTokenInformation(hToken, TokenIntegrityLevel, NULL, 0, &dwSize);

ptml = (PTOKEN_MANDATORY_LABEL)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize);

try {

::GetTokenInformation(hToken, TokenIntegrityLevel, ptml, dwSize, &dwSize);

::ConvertSidToStringSid(ptml->Label.Sid, &szSid);

try {

return (_wcscmpi(szSid, __TEXT("S-1-16-12288")) == 0);

} __finally {

::LocalFree(szSid);

}

} __finally {

::HeapFree(::GetProcessHeap(), 0, (LPVOID)ptml);

}

return false;

}



BCB6 에서는 PTOKEN_MANDATORY_LABEL 과 ToeknIntegrityLevel 이 없다.

다음 코드를 앞에 추가하면 잘 동작할 것이다.


typedef struct _TOKEN_MANDATORY_LABEL {

    SID_AND_ATTRIBUTES Label;

} TOKEN_MANDATORY_LABEL, *PTOKEN_MANDATORY_LABEL;

#define TokenIntegrityLevel ((TOKEN_INFORMATION_CLASS)25)



@ECHO OFF

AT > NUL

IF %ERRORLEVEL% EQU 0 (

  ECHO Administrator mode

) ELSE (

  ECHO User mode

)

Pause


enum Value {vlOne, vlTwo, vlThree};

Value value = 1;


이경우 value 의 값에 따라 "vlTwo" 가 필요한 경우가 있다.

이때 다음처럼 사용하면된다.


System::Typinfo::GetEnumName(__delphirtti(TType), Value);


__delphirtti 에 VCL 타입만 적용 가능한 하위버전의 개발툴에서는 다음과 같이 사용하면 된다.

(2007 까지는 VCL 타입만 가능한 것을 확인하였고, XE4 이후는 enum 도 가능한 것을 확인하였다. 그 사이 버전은 모르겠다.)


#define MakeEnumHelper(T, C) \

class C : public TObject { \

public: \

static String __fastcall GetEnumName(int V) { \

return Typinfo::GetEnumName(*Typinfo::GetPropInfo(__typeinfo(C), "P")->PropType, V);\

} \

__published: \

__property T P = {default = 0}; \

};


사용예)
MakeEnumHelper(TType, TTypeHelper);

ShowMessage(TTypeHelper::GetEnumName(Value));


log10 함수를 이용해 숫자값에 대한 문자형태의 길이를 구할 수 있다.


(int)log10((double)iValue + 1) + 1


int iValue = 123;

int iLength = (int)log10((double)iValue + 1) + 1;


참고링크: http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=1094


코드 몇 줄 안되지만 필요할때는 귀찮아서 안하게 되어 미리 적어 놓음.

링크의 코드를 내맘대로 줄이고 테스트는 안한거라 적용 후 테스트 필요.



retainCount 매커니즘을 흉내내보았다.

객체할당시 4바이트를 추가로 할당하여 retainCount 영역으로 사용.

실사용은 해보지 않은 코드이므로 충분한 검증이 필요하다.



쉬면서 해놓은거 같은 코드가 temp 폴더에 있어서 옮겨놈.

해당 예제는 one thread 로 multi thread 코드로 바꾸어 메인 작업이 중단되지 않게 사용하면 되겠다.




입력값: 개별최소값, 개별최대값, 개수, 총합
결과값: 전부 더하면 총합이 되는, 개수만큼의 무작위 숫자

5번째 값은 총합-(1~4합계) 가 되므로 총 4개의 무작위 수를 구하면 된다.




윈도우 컨트롤의 그리기를 잠시 막을 수 있는 메세지
VCL 에서 BeginUpdate 가 없는 곳에서 사용할 수 있다.


::SendMessage(Handle, WM_SETREDRAW, 0, 0); // like BeginUpdate
::SendMessage(Handle, WM_SETREDRAW, 1, 0); // like EndUpdate



p.s: TStringGrid, TDrawGrid 에 없어서 필요하였는데 TStringGrid 는 Rows, Cols 의 BeginUpdate/EndUpdate 를 이용하면 되고, TDrawGrid 를 이용할 때 쓸 수 있겠다. 

+ Recent posts