Notiz
Zougrëff op dës Säit erfuerdert Autorisatioun. Dir kënnt probéieren, Iech unzemellen oder Verzeechnesser ze änneren.
Zougrëff op dës Säit erfuerdert Autorisatioun. Dir kënnt probéieren, Verzeechnesser ze änneren.
You can pass a reference class with a CLR array to a native function, and modify the class, using PInvoke services.
Examples
Compile the following native library.
// 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;
}
};
Compile the following 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