Architecture Net



         

Службы обращения к платформе: Plnvoke (Platform Invocation Services) - часть 3


BOOL GetComputerName( // ЛОГИЧЕСКАЯ (БУЛЕВА)

LPTSTR IpBuffer, // имя компьютера

LPDWORD IpnSize // размер буфера для имени

) ;

DWORD GetLastError(VOID) ;

В следующем примере показано, как вызвать функции GetLastError и GetComputerName из кода на управляемом C++ с помощью служб обращения к платформе РInvoke (Platform Invocation Services). Обе эти функции интерфейса прикладного программирования находятся в библиотеке Kernel32 .dll, поэтому атрибут [Dlllmport ("Kernel32" ) ] использован в обоих случаях. Заметим, что маршалинг для каждого выходного параметра выполняется автоматически. Хотя это и не показано в данном простом примере, для управления деталями маршалинга, выполняемого службами обращения к платформе PInvoke (Platform Invocation Services), можно использовать атрибуты. Впрочем, это необходимо только в том случае, если маршалинг, выполняемый по умолчанию службами обращения к платформе PInvoke (Platform Invocation Services), является неудовлетворительным.

//PInvokeOutParam.cpp

fusing <mscorlib.dll>

using namespace System;

// использование пространства имен Система;

using namespace System::Runtime::InteropServices;

// использование пространства имен

// Система::Время выполнения::InteropServices;

typedef int BOOL; // ЛОГИЧЕСКИЙ (БУЛЕВ)

typedef unsigned long DWORD; // без знака

#define MAX_COMPUTERNAME_LENGTH 31

[Dlllmport("Kernel32")]

extern "C" BOOL GetComputerName(

signed char *lpBuffer, UInt32* IpnSize); // символ

// со знаком

*lpBuffer

[Dlllmport("Kernel32")]

extern "C" DWORD GetLastError();

void main(void) {

signed char * IpBuffer = // символ со знаком

new signed char[MAX_COMPUTERNAME_LENGTH + 1]; // новый символ

// со знаком

UInt32 size = MAX_COMPUTERNAME_LENGTH + 1; // размер

BOOL bResult = GetComputerName(IpBuffer, Ssize);

if (bResult)

{

String *pstrComputerName = // Строка

new String((signed char *)IpBuffer); // новая Строка ((символ со знаком *)

IpBuffer);

Console::WriteLine(

"Computer Name: {0}", pstrComputerName); // Имя компьютера

}

else

{

DWORD dwLastError = GetLastError ();

Console::WriteLine(

"Last Error: {0}", _box(dwLastError)); // Последняя

// ошибка

}

}

Когда вы запустите на выполнение пример PInvokeOutParam, то увидите нечто подобное приведенному ниже, за исключением того, что будет указано реальное имя вашего компьютера, а не моего.

Computer Name: PT-2HBHVPJUGOT9

CompEbook.ru Железо, дизайн, обучение и другие




Содержание  Назад  Вперед