Paper Planex UI(PPx)의 Text Module에 자체 제작 명령 추가

12374 단어 VC++PPx
본고는 PPxPPx Text Module에 자제 명령을 추가하는 방법을 소개한다.
또 공식 HELP에도 PPx Module 정보라고 적혀 있으니 함께 시청해 주시기 바랍니다.

자체 명령을 추가하려면


1. 설치


PPxText Module의 PPXTEXT입니다.C 를 엽니다.
"Hello"문자열만 되돌려주는 명령 "Hello"를 간단하게 만듭니다.
PPXTEXT.C
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;
        }
        省略
    }
}
수정 2016/12/14:commandhash
commandhash의 계산은 PPx의'PPD CMD.C:Get Module Name Hash'함수로 진행되며 스스로 계산할 수 있지만'*commandhash'의 지령이 준비되어 있기 때문에 이것을 사용합니다.
※ 자신의 설정이 사라지는 것을 방지하기 위해 적용 전 백업 또는 추가 획득
PPx.CFG
KC_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.DEF
LIBRARY PPXTEXT
EXPORTS
  ModuleEntry @1
MAKEFILE
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 に
cmd
E:\path\to\PPXTXSRC> nmake  

3. 집행


생성된 PPXTEXT입니다.DLL을 PPx 디렉토리로 복사하고 다음 설정을 적어 보십시오.
※ 자신의 설정이 사라지는 것을 방지하기 위해 적용 전 백업 또는 추가 획득
PPx.CFG
KC_main = { ; PPcメイン窓
^T  ,%OB echo %*hello()
}
위의 명령을 실행하면 Hello가 성공적으로 표시됩니다.

PPxText Module 소스 설명


다음은 내부라면 지령 추가 순서와 상관없이 건너뛰어도 상관없다.
먼저 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 분만 써야 한다.

좋은 웹페이지 즐겨찾기