Marshal.StringToHGlobalAnsi(String) Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Zkopíruje obsah spravovaného String objektu do nespravované paměti a při kopírování ho převede do formátu ANSI.
public:
static IntPtr StringToHGlobalAnsi(System::String ^ s);
[System.Security.SecurityCritical]
public static IntPtr StringToHGlobalAnsi (string s);
public static IntPtr StringToHGlobalAnsi (string? s);
public static IntPtr StringToHGlobalAnsi (string s);
[<System.Security.SecurityCritical>]
static member StringToHGlobalAnsi : string -> nativeint
static member StringToHGlobalAnsi : string -> nativeint
Public Shared Function StringToHGlobalAnsi (s As String) As IntPtr
Parametry
- s
- String
Spravovaný řetězec, který se má zkopírovat.
Návraty
nativeint
Adresa v nespravované paměti, do které s
se zkopírovala, nebo 0, pokud s
je null
.
- Atributy
Výjimky
Není k dispozici dostatek paměti.
Parametr s
překračuje maximální délku povolenou operačním systémem.
Příklady
Následující příklad ukazuje, jak převést obsah spravované String třídy na nespravovanou paměť a poté odstranit nespravovanou paměť po dokončení.
using namespace System;
using namespace System::Runtime::InteropServices;
#include <iostream> // for printf
int main()
{
// Create a managed string.
String^ managedString = "Hello unmanaged world (from the managed world).";
// Marshal the managed string to unmanaged memory.
char* stringPointer = (char*) Marshal::StringToHGlobalAnsi(managedString ).ToPointer();
printf("stringPointer = %s\n", stringPointer);
// Always free the unmanaged string.
Marshal::FreeHGlobal(IntPtr(stringPointer));
return 0;
}
using System;
using System.Runtime.InteropServices;
using System.Threading;
class MainFunction
{
static void Main()
{
Console.WriteLine("\nStringToGlobalAnsi\n");
// Create a managed string.
String managedString = "I am a managed String";
Console.WriteLine("1) managedString = " + managedString);
// Marshal the managed string to unmanaged memory.
IntPtr stringPointer = (IntPtr)Marshal.StringToHGlobalAnsi(managedString);
Console.WriteLine("2) stringPointer = {0}", stringPointer);
// Get the string back from unmanaged memory.
String RetrievedString = Marshal.PtrToStringAnsi(stringPointer);
Console.WriteLine("3) Retrieved from unmanaged memory = " + RetrievedString);
// Always free the unmanaged string.
Marshal.FreeHGlobal(stringPointer);
// IntPtr handle value is still the same:
Console.WriteLine("4) stringPointer = " + stringPointer);
// However, the data may be cleared after the memory is freed, depending on whether the memory allocated to stringPointer
// has been reclaimed or not. Uncommenting the following line (Thread.Sleep(1000)) increases the likelihood of the memory being reclaimed.
// Thread.Sleep(1000);
String RetrievedString2 = Marshal.PtrToStringAnsi(stringPointer);
Console.WriteLine("5) RetrievedString2 = " + RetrievedString2);
}
}
Poznámky
StringToHGlobalAnsi je užitečná pro vlastní zařazování nebo při kombinování spravovaného a nespravovaného kódu. Vzhledem k tomu, že tato metoda přidělí nespravovanou paměť potřebnou pro řetězec, vždy uvolněte paměť voláním FreeHGlobal. StringToHGlobalAnsi poskytuje opačnou funkci než Marshal.PtrToStringAnsi.
Tato metoda zkopíruje vložené znaky null a obsahuje ukončující znak null.