2017-11-13 20 views
0

NSISでは、Windowsのいくつかの関数を呼び出すいくつかのAPIを使っていました。例えばNSISでのカーネル関数の呼び出しの基本的な理解

  1. Kernel32::SetEnvironmentVariable(t, t)i ("VAR1", "$R0").r0

  2. Kernel32::GetLocaleInfo(i,i,t,i)i(2048,0x2,.r0,${NSIS_MAX_STRLEN})i

私は初心者ですと、誰もがここで何が起こっているのかを説明してくださいできますか? ti.roなどとは何ですか?

私は、kernel32がDLLであり、SetEnvironmentVariable & GetLocaleInfoがこのDLLで定義されている関数であることを知っています。

答えて

1

The documentationは、tiが何であるかを教えてくれます。

System :: Callの基本的な構文はmodule::function(parameters)returnです。パラメータと戻り値はオプションであり、どちらも同じ基本形式(type入力出力)に従います。タイプは、入力や出力が必要な場合はオプションではありません。

パラメータと戻り値は複数回繰り返すことができますが、これは関数プロトタイプが定義として存在する場合にのみ有効ですが、NSIS Wikiでもこの構文が表示されることがあります。 Kernel32::SetEnvironmentVariable(t, t)i ("VAR1", "$R0").r0は、Kernel32::SetEnvironmentVariable(t "VAR1", t "$R0")i.r0とまったく同じです。使用している場合、それは次のようになります定義:

!define SetEnvironmentVariable "Kernel32::SetEnvironmentVariable(t, t)i" 
System::Call '${SetEnvironmentVariable}("VAR1", "$R0").r0' 

あなたはC/C++やDelphiのような言語を知っている場合は、基本的なWindowsの種類とどのような機能を理解する必要があるため、システムのプラグインを使用するときにそれは便利です典型的には使用される。

あなたが最初look at the function on MSDN希望は、GetWindowsDirectory関数を呼び出すしたい例えば場合:

UINT WINAPI GetWindowsDirectory(_Out_ LPTSTR lpBuffer, _In_ UINT uSize); 

NSISにこれを翻訳(WINAPIは、デフォルトの呼び出し規約である)あなたのKernel32::GetWindowsDirectory(t, i)iの初期骨格を与えます。 WindowsのTCHAR*タイプとiからtマップは、32ビット整数、WindowsのSDKでULONGLONGDWORDINTUINTINT32UINT32と同じです。 唯一欠けている部分は入力と出力です。 MSDN宣言はSALアノテーションで装飾されているため、どのパラメータが入力され、どのパラメータが出力されているかを簡単に確認できます。入力がないとき

System::Call 'Kernel32::GetWindowsDirectory(t .r1, i ${NSIS_MAX_STRLEN})i .r0' 
DetailPrint "Return=$0 Output1=$1" 

.は「何も」プレースホルダとして使用することができます。

実施例は次のようになります。この場合、2回使用します。 System :: Callを使用している場合、戻り値には決して入力がありません。また、出力専用のパラメータも1つあります。

r1r0$1$0 NSISレジスタの別名であり、あなたが何かの出力を必要とするときに、これらのエイリアスを使用する必要があります。普通のNSISレジスタは入力として使うことができますが、プラグインではなくNSISの内部で変数の展開が行われるため、文字列に引用符が付いた問題が発生する可能性があります。構文。最初の例はKernel32::SetEnvironmentVariable(t "VAR1", t R0)i.r0と書き直すことをお勧めします。

Cで2番目の例では、詳細な情報のため

char mybuf[1024]; 
GetLocaleInfo(MAKELCID(LANG_NEUTRAL,SUBLANG_SYS_DEFAULT), LOCALE_SLANGUAGE, mybuf, sizeof(mybuf)); 
+0

おかげのようになります。私は[setlocale](https://msdn.microsoft.com/en-us/library/x99tb11d.aspx) 'setlocale(LC_ALL、" en-AU ");をNSIS呼び出し形式に変換しようとしました。次の問題は何ですか? 'StrCpy $ R0" LC_ALL "; StrCpy $ R1 "en-AU"; System :: Call 'kernel32 :: setlocale(i R0、t R1)t .r0' '; 出力は$ 0にあります//エラー –

+0

setlocaleはkernel32の一部ではありません。 NSISは実際にCRTを使用しませんが、msvcrt :: setlocaleを試すことができます。また、CRTはcdeclを使用するため、 '?c'で構文を終了する必要があります。 "LC_ALL"は文字列ではなく数字であると考えられており、その数値が実際にMicrosoftの.hファイルに含まれているかどうかを調べる必要があります。あなたが何をしていてもNSISはこの設定を尊重しません。 – Anders

関連する問題