0

地下室にある多数のコンピューターに cgminer を展開するのに役立つように、NSIS を使用してインストーラーを作成しています。インストーラーは次の 2 つのことを要求します。

  • マイニング プールの URL とワーカーの資格情報
  • cgminer を展開するディレクトリ

インストーラーは、ユーザーが提供したプール URL、ログイン名、およびパスワードを使用して、単純な cgminer 構成ファイルを生成します。

JSON 構成ファイルを書き込むコードは次のとおりです。

FileOpen $9 $INSTDIR\config.conf w ;Opens a Empty File for writing
FileWrite $9 "{$\r$\n"
FileWrite $9 "$\"pools$\" : [$\r$\n"
FileWrite $9 "$\t{$\r$\n"
FileWrite $9 "$\t$\t$\"url$\" : $\"$POOL$\",$\r$\n"
FileWrite $9 "$\t$\t$\"user$\" : $\"$USER$\",$\r$\n"
FileWrite $9 "$\t$\t$\"pass$\" : $\"$PASS$\",$\r$\n"
FileWrite $9 "$\t}$\r$\n"
FileWrite $9 "],$\r$\n"
FileWrite $9 "$\r$\n"
FileWrite $9 "$\"intensity$\" : $\"d$\"$\r$\n"
FileWrite $9 "}$\r$\n"
FileClose $9 ; closes the file

これは私が期待しているものです:

{
"pools" : [
        {
                "url" : "http://bc.minercity.org:4583",
                "user" : "fizzlefazzle_miner",
                "pass" : "rosebud",
        }
],

"intensity" : "d"
}

しかし、これは私が得るものです:

{
"pools" : [
        {
                "url" : "1639776",
                "user" : "1115594",
                "pass" : "1115614",
        }
],

"intensity" : "d"
}

入力した文字列ではなく、メモリアドレスを取得していると思います。コード全体は次のとおりです。

; bitcoinminer.nsi
;
; sets up a basic bitcoin miner.
; asks user for mining pool and user/pass
; installs cgminer to <OS DRIVE>\Documents and Settings\<CURRENT USER>\Local Settings\Application Data\ccc\bitcoin\cgminer
; generates cgminer config file and puts it in above dir
;

;--------------------------------

; Includes

!include nsDialogs.nsh
!include LogicLib.nsh

;--------------------------------

; The name of the installer
Name "Bitcoin Miner"

OutFile BitcoinMiner.exe

; The default installation directory
InstallDir "$PROFILE\Local Settings\Application Data\ccc\bitcoin\cgminer2"

; Request application privileges for Windows Vista
RequestExecutionLevel user


;--------------------------------

; Pages

Page Custom poolPageCreate poolPageLeave
Page directory
Page instfiles

Var POOL
Var USER
Var PASS

Function poolPageCreate

    nsDialogs::Create 1018  ; creates a new dialog and returns it's HWND on the stack
    Pop $0                  ; HWID of new dialog stored to $0

    ${NSD_CreateLabel} 0 0u 75% 12u "Pool URL (ex: http://bc.minercity.org:6347)" ; create label. HWND on the stack
    Pop $0                                                                   ; HWID of new label stored to $0

    ${NSD_CreateText} 0 13u 100% 12u 'http://bc.minercity.org:6347'                
    Pop $POOL
    GetFunctionAddress $0 poolChange
    nsDialogs::OnChange $POOL $0

    ${NSD_CreateLabel} 0 40u 75% 12u "Login name (ex: fizzlefazzle_miner)"
    Pop $0  

    ${NSD_CreateText} 0 53u 100% 12u 'fizzlefazzle_miner'
    Pop $USER
    GetFunctionAddress $0 userChange
    nsDialogs::OnChange $USER $0

    ${NSD_CreateLabel} 0 77u 75% 12u "Password (ex: rosebud)"
    Pop $0

    ${NSD_CreateText} 0 90u 100% 12u 'rosebud'
    Pop $PASS
    GetFunctionAddress $0 passChange
    nsDialogs::OnChange $PASS $0

    nsDialogs::Show

FunctionEnd

Function poolPageLeave

FunctionEnd

Function poolChange

    Pop $0 # HWND
    System::Call user32::GetWindowText(i$POOL,t.r0,i${NSIS_MAX_STRLEN})

FunctionEnd


Function userChange

    Pop $0
    System::Call user32::GetWindowText(i$USER,t.r0,i${NSIS_MAX_STRLEN})

FunctionEnd

Function passChange

    Pop $0
    System::Call user32::GetWindowText(i$PASS,t.r0,i${NSIS_MAX_STRLEN})

FunctionEnd

Section

;--------------------------------

; The stuff to install

  ; Set output path to the installation directory.
  SetOutPath $INSTDIR

  ; Put file there
  File /r "cgminer\"

  FileOpen $9 $INSTDIR\config.conf w ;Opens a Empty File for writing
  FileWrite $9 "{$\r$\n"
  FileWrite $9 "$\"pools$\" : [$\r$\n"
  FileWrite $9 "$\t{$\r$\n"
  FileWrite $9 "$\t$\t$\"url$\" : $\"$POOL$\",$\r$\n"
  FileWrite $9 "$\t$\t$\"user$\" : $\"$USER$\",$\r$\n"
  FileWrite $9 "$\t$\t$\"pass$\" : $\"$PASS$\",$\r$\n"
  FileWrite $9 "$\t}$\r$\n"
  FileWrite $9 "],$\r$\n"
  FileWrite $9 "$\r$\n"
  FileWrite $9 "$\"intensity$\" : $\"d$\"$\r$\n"
  FileWrite $9 "}$\r$\n"
  FileClose $9 ; closes the file

SectionEnd

私は何を間違っていますか?

4

3 に答える 3

2

nsis用のjsonプラグインがあることを付け加えさせてください

于 2013-06-25T13:14:17.297 に答える
2

文字列補間に問題はありません。あなたの問題は、編集テキストの処理にあります。たとえば、次のように述べるとき

${NSD_CreateText} 0 13u 100% 12u 'http://bc.minercity.org:6347'                
Pop $POOL
GetFunctionAddress $0 poolChange
nsDialogs::OnChange $POOL $0

編集テキストを正しく作成し、定義されたコールバックで使用するハンドルを保持します。でもその後

FileWrite $9 "$\t$\t$\"url$\" : $\"$POOL$\",$\r$\n"

ファイル書き込みは、ファイルの内容ではなく、コントロール ハンドルをファイルに保存します。

また、コールバックにはいくつかの問題があります。

  • 編集のさまざまな値を同じ$0レジスタに読み込むため$0、最後に変更されたフィールドのテキストが含まれます
  • コールバックは編集が変更されたときにのみトリガーされ、ユーザーが変更を行わない場合はトリガーされません。

編集ハンドル用に 3 つの変数を使用し、値用に別の 3 つの変数を使用して、ページ離脱コールバックで値を読み取ります。また、最終的な値を取得したいだけで、値の変更に反応したくない場合は、3 つのコールバックを削除できます。

!include nsDialogs.nsh
!include LogicLib.nsh
Name "Bitcoin Miner"
OutFile BitcoinMiner.exe
RequestExecutionLevel user

Page Custom poolPageCreate poolPageLeave
Page directory
Page instfiles

Var POOLHDL
Var USERHDL
Var PASSHDL
Var POOL
Var USER
Var PASS

Function poolPageCreate

    nsDialogs::Create 1018  ; creates a new dialog and returns it's HWND on the stack
    Pop $0                  ; HWID of new dialog stored to $0

    ${NSD_CreateLabel} 0 0u 75% 12u "Pool URL (ex: http://bc.minercity.org:6347)" ; create label. HWND on the stack
    Pop $0                                                                   ; HWID of new label stored to $0

    ${NSD_CreateText} 0 13u 100% 12u 'http://bc.minercity.org:6347'                
    Pop $POOLHDL

    ${NSD_CreateLabel} 0 40u 75% 12u "Login name (ex: fizzlefazzle_miner)"
    Pop $0  

    ${NSD_CreateText} 0 53u 100% 12u 'fizzlefazzle_miner'
    Pop $USERHDL

    ${NSD_CreateLabel} 0 77u 75% 12u "Password (ex: rosebud)"
    Pop $0

    ${NSD_CreateText} 0 90u 100% 12u 'rosebud'
    Pop $PASSHDL

    nsDialogs::Show

FunctionEnd

Function poolPageLeave
    ${NSD_GetText} $POOLHDL $POOL
    ${NSD_GetText} $USERHDL $USER 
    ${NSD_GetText} $PASSHDL $PASS 
FunctionEnd

Section

  SetOutPath $INSTDIR

  File /r "cgminer\"

  FileOpen $9 $EXEDIR\config.conf w ;Opens a Empty File for writing
  FileWrite $9 "{$\r$\n"
  FileWrite $9 "$\"pools$\" : [$\r$\n"
  FileWrite $9 "$\t{$\r$\n"
  FileWrite $9 "$\t$\t$\"url$\" : $\"$POOL$\",$\r$\n"
  FileWrite $9 "$\t$\t$\"user$\" : $\"$USER$\",$\r$\n"
  FileWrite $9 "$\t$\t$\"pass$\" : $\"$PASS$\",$\r$\n"
  FileWrite $9 "$\t}$\r$\n"
  FileWrite $9 "],$\r$\n"
  FileWrite $9 "$\r$\n"
  FileWrite $9 "$\"intensity$\" : $\"d$\"$\r$\n"
  FileWrite $9 "}$\r$\n"
  FileClose $9 ; closes the file

SectionEnd
于 2013-06-25T12:34:05.513 に答える