Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Anda dapat meneruskan kelas referensi dengan array CLR ke fungsi asli, dan memodifikasi kelas, menggunakan layanan PInvoke.
Contoh
Kompilasi pustaka asli berikut.
// 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;
}
};
Kompilasi rakitan berikut.
// 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