Paper Planex UI(PPx)의 Text Module에 자체 제작 명령 추가
또 공식 HELP에도 PPx Module 정보라고 적혀 있으니 함께 시청해 주시기 바랍니다.
자체 명령을 추가하려면
1. 설치
PPxText Module의 PPXTEXT입니다.C 를 엽니다.
"Hello"문자열만 되돌려주는 명령 "Hello"를 간단하게 만듭니다.
PPXTEXT.CBOOL PPXAPI ModuleEntry(PPXAPPINFOW *ppxa,DWORD cmdID,PPXMODULEPARAM pxs)
{
if ( cmdID == PPXMEVENT_FUNCTION ){
省略
if ( ((pxs.command->commandhash == 0) || (pxs.command->commandhash == 0xc914d34f)) && !wcscmp(pxs.command->commandname,L"HELLO")){
wcscpy(pxs.command->resultstring, L"Hello");
return TRUE;
}
省略
}
}
수정 2016/12/14:commandhash
commandhash의 계산은 PPx의'PPD CMD.C:Get Module Name Hash'함수로 진행되며 스스로 계산할 수 있지만'*commandhash'의 지령이 준비되어 있기 때문에 이것을 사용합니다.
※ 자신의 설정이 사라지는 것을 방지하기 위해 적용 전 백업 또는 추가 획득
PPx.CFGKC_main = { ; PPcメイン窓
^H ,*commandhash %"commandhash"%{commandname%}
}
commandhash를 계산할 단축키를 등록하고 "hello"를 계산합니다.
이 때의 '0xc914d34f' 는 Hello 명령 (대문자 HELLO) 의commandhash입니다.
이외에 ppxcmd도 있습니다.pl의 NameHash도 조사할 수 있습니다.
2. 구축
저장한 후 PPxText Module을 구성합니다.
이 때, VC++를 통해makefile을 구축 설정으로 변경합니다.
※ 나의 경우 VC+2015×86 Native Build Tools Command Proompt를 사용합니다.
2016/12/13 스포츠투데이
또 다른 def 파일도 준비했다.
PPXTEXT.DEFLIBRARY PPXTEXT
EXPORTS
ModuleEntry @1
MAKEFILEUseDebug = 0 # 1 なら debug 指定
UseBCC = 0 # 1 なら BCC32 , 0 なら CL
UseIlink = 0 # 1 なら ilink32(BCC 5.5以降) を使用
VCTOOLKIT = 1 # VC TOOL KIT を使うなら 1 に、VS2008なら 0 に
cmdE:\path\to\PPXTXSRC> nmake
3. 집행
생성된 PPXTEXT입니다.DLL을 PPx 디렉토리로 복사하고 다음 설정을 적어 보십시오.
※ 자신의 설정이 사라지는 것을 방지하기 위해 적용 전 백업 또는 추가 획득
PPx.CFGKC_main = { ; PPcメイン窓
^T ,%OB echo %*hello()
}
위의 명령을 실행하면 Hello가 성공적으로 표시됩니다.
PPxText Module 소스 설명
다음은 내부라면 지령 추가 순서와 상관없이 건너뛰어도 상관없다.
먼저 PPxText Module의 PPXTEXT입니다.C 열기
PPXTEXT.CBOOL PPXAPI ModuleEntry(PPXAPPINFOW *ppxa,DWORD cmdID,PPXMODULEPARAM pxs)
{
if ( cmdID == PPXMEVENT_FUNCTION ){
// ====================================================================
if (省略 "NOWDATETIME")){
省略
}
if ( ((pxs.command->commandhash == 0) || (pxs.command->commandhash == 0xf75d5755)) && !wcscmp(pxs.command->commandname,L"CLIPPEDTEXT")){
int len = 0;
if ( OpenClipboard( ppxa->hWnd ) != FALSE ){
HGLOBAL hG;
WCHAR *text;
hG = GetClipboardData(CF_UNICODETEXT);
text = GlobalLock(hG);
len = wcslen(text);
if ( len > (CMDLINESIZE - 16) ) len = CMDLINESIZE - 16;
memcpy( pxs.command->resultstring,text,len * sizeof(WCHAR) );
GlobalUnlock(text);
CloseClipboard();
}
pxs.command->resultstring[len] = '\0';
return TRUE;
}
...
}
기존 명령의 CLIPPEDTEXT 예를 들어 설명합니다.
여기서 중요한 것은'봉화(pxs.commandname, L'CLIPPEDTEXT')''commandhash = 0xf75d5755''pxs.command->resulttring'세 가지다.
!wcscmp(pxs.command->commandname,L"CLIPPEDTEXT")
외관상으로 볼 수 있는 바와 같이 이것은'*clippedtext'명령의 대문자와 일치하는 검사입니다. 아직 처리되지 않았지만 pxs입니다.command->commandname에는 호출될 명령의 대문자 문자열이 포함되어 있습니다.
commandhash == 0xf75d5755
수정 2016/12/14:commandhash
이것은 "CLIPPEDTEXT"에서 생성된 해시 값입니다. 미리 pxs입니다.xx->commandhash를 조사하면 명령명 전체의 검색 속도를 높일 수 있습니다.
pxs.command->resultstring
이것은 반환값입니다. PPxTextModule에서는 단순히 메모리에 기록했을 뿐입니다. 그러나 기록할 수 있는 양이 얼마인지 다시 한번 찾아보십시오.
PPx 측면의 PPDMLD.C 를 치면...
PPD_MDL.Cvoid FunctionModule(EXECSTRUCT *Z)
{
省略
#ifndef UNICODE
WCHAR 省略,destW[CMDLINESIZE];
#define DESTBUF destW
#else
#define DESTBUF Z->dst
#endif
省略
function.resultstring = DESTBUF;
}
ANSI는 WCHAR의 CMDLINSIZE로 정렬됩니다.
여기서 UNICODE를 탐색할 때의DESTBUF, Z->dst는 Z->DstBuf를 가리키는 지침입니다
PPD_CMD.C// Z の初期化 -----------------------------------------------------------------
void ZInit(EXECSTRUCT *Z)
{
省略
Z->dst = Z->edit.EdBottom = Z->DstBuf;
省略
}
Z->DstBuf는 [CMDLINSIZE*2]의 배열입니다.
PPD_DEF.Htypedef struct {
省略
TCHAR DstBuf[CMDLINESIZE * 2]; // 変換後の内容を保存する一時領域
} EXECSTRUCT;
왜냐하면 CMDLINSIZE가 1024거든요.
PPCOMMON.H#define CMDLINESIZE 0x400 // コマンドラインの大きさ
ANSI와 UNICODE를 함께 2048바이트의 내용을 쓰고, 다시 쓰면 Segmentation fault가 발생합니다.
다만, *2를 쓰려면 안전보증금을 챙겨야 하기 때문에 실제 쓸 때는 CMDLINSIZE 분만 써야 한다.
Reference
이 문제에 관하여(Paper Planex UI(PPx)의 Text Module에 자체 제작 명령 추가), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/wordijp/items/2170dc656d68253a5261
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
BOOL PPXAPI ModuleEntry(PPXAPPINFOW *ppxa,DWORD cmdID,PPXMODULEPARAM pxs)
{
if ( cmdID == PPXMEVENT_FUNCTION ){
省略
if ( ((pxs.command->commandhash == 0) || (pxs.command->commandhash == 0xc914d34f)) && !wcscmp(pxs.command->commandname,L"HELLO")){
wcscpy(pxs.command->resultstring, L"Hello");
return TRUE;
}
省略
}
}
KC_main = { ; PPcメイン窓
^H ,*commandhash %"commandhash"%{commandname%}
}
LIBRARY PPXTEXT
EXPORTS
ModuleEntry @1
UseDebug = 0 # 1 なら debug 指定
UseBCC = 0 # 1 なら BCC32 , 0 なら CL
UseIlink = 0 # 1 なら ilink32(BCC 5.5以降) を使用
VCTOOLKIT = 1 # VC TOOL KIT を使うなら 1 に、VS2008なら 0 に
E:\path\to\PPXTXSRC> nmake
KC_main = { ; PPcメイン窓
^T ,%OB echo %*hello()
}
다음은 내부라면 지령 추가 순서와 상관없이 건너뛰어도 상관없다.
먼저 PPxText Module의 PPXTEXT입니다.C 열기
PPXTEXT.C
BOOL PPXAPI ModuleEntry(PPXAPPINFOW *ppxa,DWORD cmdID,PPXMODULEPARAM pxs)
{
if ( cmdID == PPXMEVENT_FUNCTION ){
// ====================================================================
if (省略 "NOWDATETIME")){
省略
}
if ( ((pxs.command->commandhash == 0) || (pxs.command->commandhash == 0xf75d5755)) && !wcscmp(pxs.command->commandname,L"CLIPPEDTEXT")){
int len = 0;
if ( OpenClipboard( ppxa->hWnd ) != FALSE ){
HGLOBAL hG;
WCHAR *text;
hG = GetClipboardData(CF_UNICODETEXT);
text = GlobalLock(hG);
len = wcslen(text);
if ( len > (CMDLINESIZE - 16) ) len = CMDLINESIZE - 16;
memcpy( pxs.command->resultstring,text,len * sizeof(WCHAR) );
GlobalUnlock(text);
CloseClipboard();
}
pxs.command->resultstring[len] = '\0';
return TRUE;
}
...
}
기존 명령의 CLIPPEDTEXT 예를 들어 설명합니다.여기서 중요한 것은'봉화(pxs.commandname, L'CLIPPEDTEXT')''commandhash = 0xf75d5755''pxs.command->resulttring'세 가지다.
!wcscmp(pxs.command->commandname,L"CLIPPEDTEXT")
외관상으로 볼 수 있는 바와 같이 이것은'*clippedtext'명령의 대문자와 일치하는 검사입니다. 아직 처리되지 않았지만 pxs입니다.command->commandname에는 호출될 명령의 대문자 문자열이 포함되어 있습니다.
commandhash == 0xf75d5755
수정 2016/12/14:commandhash
이것은 "CLIPPEDTEXT"에서 생성된 해시 값입니다. 미리 pxs입니다.xx->commandhash를 조사하면 명령명 전체의 검색 속도를 높일 수 있습니다.
pxs.command->resultstring
이것은 반환값입니다. PPxTextModule에서는 단순히 메모리에 기록했을 뿐입니다. 그러나 기록할 수 있는 양이 얼마인지 다시 한번 찾아보십시오.
PPx 측면의 PPDMLD.C 를 치면...
PPD_MDL.C
void FunctionModule(EXECSTRUCT *Z)
{
省略
#ifndef UNICODE
WCHAR 省略,destW[CMDLINESIZE];
#define DESTBUF destW
#else
#define DESTBUF Z->dst
#endif
省略
function.resultstring = DESTBUF;
}
ANSI는 WCHAR의 CMDLINSIZE로 정렬됩니다.여기서 UNICODE를 탐색할 때의DESTBUF, Z->dst는 Z->DstBuf를 가리키는 지침입니다
PPD_CMD.C
// Z の初期化 -----------------------------------------------------------------
void ZInit(EXECSTRUCT *Z)
{
省略
Z->dst = Z->edit.EdBottom = Z->DstBuf;
省略
}
Z->DstBuf는 [CMDLINSIZE*2]의 배열입니다.PPD_DEF.H
typedef struct {
省略
TCHAR DstBuf[CMDLINESIZE * 2]; // 変換後の内容を保存する一時領域
} EXECSTRUCT;
왜냐하면 CMDLINSIZE가 1024거든요.PPCOMMON.H
#define CMDLINESIZE 0x400 // コマンドラインの大きさ
ANSI와 UNICODE를 함께 2048바이트의 내용을 쓰고, 다시 쓰면 Segmentation fault가 발생합니다.다만, *2를 쓰려면 안전보증금을 챙겨야 하기 때문에 실제 쓸 때는 CMDLINSIZE 분만 써야 한다.
Reference
이 문제에 관하여(Paper Planex UI(PPx)의 Text Module에 자체 제작 명령 추가), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/wordijp/items/2170dc656d68253a5261텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)