Riverside Learning LABO(Skill/Idea/Code)

よりよいシステムのため工学系と人間系の学習下書きメモ

マネージドコードとアンマネージドコ

■マネージ→アンマネージ変換
・String型→char型の格納
[コーディング方法]
 String^ strWork = データセット->String型項目名->Trim();
 strWork = String::Format("{0, -" + sizeof(格納先構造体->項目名) + "}", strWork);
 memcpy(格納先構造体->項目名, (char*)(void*)Marshal::StringToHGlobalAnsi(strWork), sizeof(格納先構造体->項目名));

・int(Int32)型→short int型の格納
[コーディング方法]
 Marshal::WriteInt16(IntPtr(&格納先構造体->項目名), 0, (short)データセット->int型項目名);

・int(Int32)型→long int型の格納
[コーディング方法]
 Marshal::WriteInt32(IntPtr(&格納先構造体->項目名), 0,
                                 データセット->int型項目名);

・DateTime型→long型の格納
[コーディング方法]
 char cDate[8];
 String^ strWork = データセット->日付型項目名.ToString("yyyyMMdd");
 memset(cDate, 0x00, sizeof(cDate));
 memcpy(cDate, (char*)(void*)Marshal::StringToHGlobalAnsi(strWork), sizeof(cDate));

・Byte型→char型の格納
[コーディング方法]
     Marshal::Copy(データセット->バイト型項目名,
                   0,
                   IntPtr(格納先構造体->項目名),
                   sizeof(格納先構造体->項目名));
 }


・Decimal型→char型の格納
[コーディング方法]
 char cMoney[20];
 String^ strWork = データセット->Decimal型項目名.ToString();
 strWork = String::Format("{0, -" + sizeof(cMoney) + "}", strWork);
 memset(cMoney, 0x00, sizeof(cMoney));
 memcpy(cMoney, (char*)(void*)Marshal::StringToHGlobalAnsi(strWork), sizeof(cMoney));


・DateTime型→int64型の格納
[コーディング方法]
 char cDTime[16];
 String^ strWork = データセット->DateTime型項目名.ToString("yyyyMMddhhmmss");
 memset(cDTime, 0x00, sizeof(cDTime));
 memcpy(cDTime, (char*)(void*)Marshal::StringToHGlobalAnsi(strWork), sizeof(cDTime));


■アンマネージ→マネージ変換
・char型→String型の格納
[コーディング方法]
 memset(cWork, 0x00, sizeof(cWork));
 memcpy(cWork, 格納元構造体->項目名, sizeof(格納元構造体->項目名));
 dr->会社コード = gcnew String(cWork);

・short int型→int(Int32)型の格納
[コーディング方法]
 dr->整数データのメンバ名 = 格納元構造体->short intの項目

・long int型→int(Int32)型の格納
[コーディング方法]
 dr->整数データのメンバ名 = 格納元構造体->long intの項目

・GDate型→DateTime型の格納
[コーディング方法]
 char cbuf[8];
 memcpy(cbuf, 格納元構造体->Date型のデータ, sizeof(cbuf));
 DateTime ^dtb = DateTime::ParseExact(cbuf,
                 "yyyyMMdd",
                 System::Globalization::DateTimeFormatInfo::InvariantInfo,
                 System::Globalization::DateTimeStyles::None);
 dr->DateTime型のメンバ名 = dtb;

・char型→Byte型の格納
[コーディング方法]
 array^ Byte配列 = gcnew array(sizeof(格納元構造体->u_charの項目))
 Marshal::Copy(IntPtr(sceAdjustInfoE00->u_char[]の項目),
               Byte配列,
               0,
               sizeof(Byte配列->Length));
 dr->Byte[]のメンバ名 = Byte配列

・int64型→Decimalの格納
[コーディング方法]
 char cbuf[8];
 memset(cMoney, 0x00, sizeof(cMoney));
 memcpy(cbuf, 格納元構造体->Date型のデータ, sizeof(cbuf));
 String^ strWork = gcnew String(cMoney);
 dr->Decimal型のメンバ名 = Decimal::Parse(strWork);