シグネチャがアンマネージ エントリ ポイントを直接変換したものかどうかを示します。
Public PreserveSig As Boolean
[C#]
public bool PreserveSig;
[C++]
public: bool PreserveSig;
[JScript]
public var PreserveSig : Boolean;
解説
プラットフォーム呼び出しで呼び出されるメソッドのほとんどは HRESULT を返しません。この場合、HRESULT/[out, retval] の変換は意味がありません。このため、既定の動作では、シグネチャを定義どおりに保持します。このフィールドの既定値は true です。
既定の動作をオーバーライドして、シグネチャを変換する必要があるときもあります。たとえば、 HRESULT CoCreateInstance(...)
などのメソッドの定義では、このフィールドを false に設定する必要があります。 false に設定すると、HRESULT に S_OK を返す呼び出しは、[out, retval] パラメータが関数の戻り値として使用されるように、変換されます。S_OK の HRESULT は破棄されます。HRESULT が S_OK 以外の場合、共通言語ランタイムは例外をスローして、[out, retval] パラメータを破棄します。HRESULT を返すメソッドだけが変換の対象となります。
このフィールドは PreserveSigAttribute と似ていますが、 PreserveSig フィールドとは異なり、この属性の既定値は false です。
使用例
[Visual Basic, C#] 場合によっては、Visual Basic の開発者は、マネージ コードで DLL 関数を定義する際、 Declare ステートメントを使用する代わりに、 DllImportAttribute を使用します。 PreserveSig フィールドの設定は、このような事例の 1 つです。
Imports System.Runtime.InteropServices
Public Class Win32
<DllImport ("user32.dll", PreserveSig := False)> _
Public Shared Function MessageBoxA (ByVal hWnd As _
Integer, ByVal txt As String, ByVal caption As String, _
ByVal Typ As Integer) As Integer
End Function
End Class
[C#]
using System.Runtime.InteropServices;
public class Win32 {
[DllImport("user32.dll", PreserveSig=false)]
public static extern int MessageBoxA(int hWnd, String text, String
caption, uint type);
}
[C++]
using namespace System::Runtime::InteropServices;
typedef void* HWND;
[DllImport("user32", PreserveSig=true)]
extern "C" int MessageBoxA(HWND hWnd,
String* pText,
String* pCaption,
unsigned int uType);
[C++, JScript] C++ および JScript のサンプルはありません。Visual Basic および C# のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ
参照
DllImportAttribute クラス | DllImportAttribute メンバ | System.Runtime.InteropServices 名前空間 | PreserveSigAttribute