DLL 関数への文字列引数の受け渡し

DLL 関数に渡している文字列、または DLL 関数から戻される文字列は、デフォルトでは Unicode Strings として処理されます。 DLL 関数に ANSI String 引数が必要な場合は、DllFunctionOptions 属性の CharacterSet プロパティーを使用します。

@Dll( "user32.dll" )
public interface IUserDll32Functions {
  @FunctionOptions(characterSet=DllCharacterSet.Ansi)
  int SendMessageA(TestObject obj, int message, int wParam, Object lParam);
}

DLL 呼び出しから String を OutArgument として戻した場合、String のサイズが 256 文字以下であれば、デフォルトの動作に従います。 戻される String が 256 文字を超えている場合は、作成された String を保持できるだけの長さを持つ、String を使用して InOurArgument を渡します。

1024 個の空白文字を含む String を作成するには、以下のコードを使用します。
char[] charArray = new char[1024];
Arrays.fill(charArray,' ');
String longEmptyString = new String(charArray);
この InOutArgument を引数として DLL 関数に渡します。すると、この DLL 関数は最大 1024 文字の String を戻します。

関数の戻り値として DLL から String が戻される場合、DLL は DLL 関数 FreeDllMemory を実装し、DLL 関数から戻される C String ポインターを受け入れて、以前に割り当てられたメモリーを解放する必要があります。 このような関数が存在しない場合、メモリーはリークされます。