「トップページ/CPPCLI/LEGACY」の編集履歴(バックアップ)一覧に戻る

トップページ/CPPCLI/LEGACY - (2007/10/12 (金) 22:28:56) のソース

|&big(){C/C++への橋渡し}|

----
*C++/CLIからC/C++へ数値を渡す
普通に呼ぶだけです。

----
*C++/CLIからC/C++へ文字列を渡す
System::Runtime::InteropServices::Marshal::StringTOHGlobalAnsi(str...)
 #include "stdafx.h"
 using namespace System; 
 using namespace System::Runtime::InteropServices; 
 
 #include "stdio.h"
 extern "C" void testFunc(char* p) {
    puts(p);
 }
 int main(array<System::String ^> ^args) {
 
    String^ str = "abあcdefg";
 
    System::IntPtr pp = Marshal::StringToHGlobalAnsi(str);
    // !!!StringTOHGlobalUniを使うと、半角英数字も1文字2バイトで変換されてしまう
    testFunc(static_cast<char*>(pp.ToPointer()));
    Marshal::FreeHGlobal(pp);
 
    return 0;
 } 

----
*C++/CLIからC/C++へポインタを渡す
pin_ptrを使います。MSDNでは、「固定ポインタ」と解説されています。
 #include "stdafx.h"
 using namespace System; 
 
 extern "C" void testFunc(int* p) {
    (*p)++;
 }
 int main(array<System::String ^> ^args) {
 
    int intVar = 3;
    Console::WriteLine(intVar);    // 3と表示される。
 
    pin_ptr<int>pinPtr = &intVar;  // intVarのアドレスをpinPtrに代入して
    testFunc(pinPtr);              // pinPtrでテスト関数を呼び出す。
 
    Console::WriteLine(intVar);    // 4と表示される。
 
    return 0;
 } 
----
*C++/CLIからC/C++へ配列を渡す
アンマネージメモリを確保し、そこに配列をコピーします。
 #include "stdafx.h"
 using namespace System; 
 using namespace System::Runtime::InteropServices; 
 
 // テスト用の古い関数
 #include "stdio.h"
 extern "C" void testFunc(int* p, int s) {
    for (int i = 0; i < s; i ++) {
        printf("No.%d = %d\n", i, p[i]);
    }
 }
 int main(array<System::String ^> ^args) {
 
    array<int>^ srcArray = gcnew array<int>{ 1, 2, 3, 4, 5};
    // アンマネージメモリの確保
    IntPtr pWrkMem = Marshal::AllocHGlobal(sizeof(int)*srcArray->Length);
    // 確保したメモリに配列をコピー
    Marshal::Copy(srcArray, 0, pWrkMem, manarr->Length);
    // テスト関数の呼び出し
    testFunc( static_cast<int*>(pWrkMem.ToPointer()), srcArray->Length);
    // アンマネージメモリの開放
    Marshal::FreeHGlobal(pWrkMem);
 
    return 0;
 } 
----