Architecture Net



         

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


//PInvoke.срр

fusing <mscorlib.dll>

using namespace System;

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

using namespace System::Runtime::InteropServices;

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

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

typedef void* HWND;

[Dlllmport("user32")]

extern "C" int MessageBoxA( // интерфейс 32-разрядных

// Windows-приложений (Win32 API)

HWND hWnd, // дескриптор окна владельца

String* pText, // текст окна сообщений

String* pCaption, // заголовок окна сообщений

unsigned int uType // стиль окна сообщений

);

void main(void) {

String* pText = L"Hello PInvoke!"; // Привет PInvoke!

String* pCaption = L"PInvoke Example"; // Пример PInvoke

MessageBoxA(0, pText, pCaption, 0); }

В результате выполнения этой программы будет выведено окно сообщения, показанное на рис. 15.7.

7.gif



Рис. 15.7. Это окно сообщения будет выведено при выполнении программы PInvoke.cpp

В приведенном примере PInvoke (Platform Invocation Services, Службы обращения к платформе) не показано, как службы обращения к платформе PInvoke (Platform Invocation Services) автоматически выполняют маршалинг выходных параметров. Это связано с тем, что MessageBox имеет только входные параметры. В следующем примере вызываются интерфейсы прикладных программ (API) GetComputerName и GetLastError посредством служб обращения к платформе PInvoke (Platform Invocation Services)

Первый параметр функции GetComputerName с именем IpBuffer, является выходным указателем на буфер, в который записывается строка с завершающим нулем, содержащая имя компьютера в случае успешного выполнения функции Второй параметр IpnSize является и входным, и выходным. В случае использования его в качестве входного параметра, в нем задается длина буфера IpBuffer в символах TCHAR. В случае использования его в качестве выходного параметра в нем указывается фактическая длина имени компьютера в символах TCHAR, которая содержится в IpBuffer, причем завершающий нулевой символ при подсчете длины не учитывается. Возвращаемое значение указывает, было ли успешным выполнение функции. Ненулевое значение указывает на ее успешное выполнение, а нулевое — на ошибку. Если возвращенное значение равно нулю, можно использовать функцию GetLastError для определения причины ошибки. Например, если буфер оказался недостаточно длинным для имени компьютера, эта функция вернет константу ERROR_BUFFER_OVERFLOW, имеющую значение 111. Если вы хотите попробовать самостоятельно использовать службы обращения к платформе PInvoke (Platform Invocation Services), и не будете против приложить некоторые усилия, то можете вызвать функцию интерфейса прикладных программ (API) FormatMessage для перевода этого номера ошибки в более осмысленную строку. Если вы это сделаете, и в достаточной мере укоротите длину буфера, то получите описание ошибки: "The File name is too long" ("Имя файла слишком длинное"). Прототипы функций GetComputerName и GetLastError приведены ниже:




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