Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Sie können eine Referenzklasse mit einem CLR-Array an eine systemeigene Funktion übergeben und die Klasse mithilfe von PInvoke-Diensten ändern.
Beispiele
Kompilieren Sie die folgende systemeigene Bibliothek.
// modify_ref_class_in_native_function.cpp
// compile with: /LD
#include <stdio.h>
#include <windows.h>
struct S {
wchar_t* str;
int intarr[2];
};
extern "C" {
__declspec(dllexport) int bar(S* param) {
printf_s("str: %S\n", param->str);
fflush(stdin);
fflush(stdout);
printf_s("In native: intarr: %d, %d\n",
param->intarr[0], param->intarr[1]);
fflush(stdin);
fflush(stdout);
param->intarr[0]=300;param->intarr[1]=400;
return 0;
}
};
Kompilieren Sie die folgende Assembly.
// modify_ref_class_in_native_function_2.cpp
// compile with: /clr
using namespace System;
using namespace System::Runtime::InteropServices;
[StructLayout(LayoutKind::Sequential, CharSet = CharSet::Unicode)]
ref class S {
public:
[MarshalAsAttribute(UnmanagedType::LPWStr)]
String ^ str;
[MarshalAsAttribute(UnmanagedType::ByValArray,
ArraySubType=UnmanagedType::I4, SizeConst=2)]
array<Int32> ^ intarr;
};
[DllImport("modify_ref_class_in_native_function.dll",
CharSet=CharSet::Unicode)]
int bar([In][Out] S ^ param);
int main() {
S ^ param = gcnew S;
param->str = "Hello";
param->intarr = gcnew array<Int32>(2);
param->intarr[0] = 100;
param->intarr[1] = 200;
bar(param); // Call to native function
Console::WriteLine("In managed: intarr: {0}, {1}",
param->intarr[0], param->intarr[1]);
}
str: Hello
In native: intarr: 100, 200
In managed: intarr: 300, 400