ドラッグアンドドロップされたファイル名を取り出して、これを C の文字列にするために作った関数が
昨日の時点ではこうでした。

System::Void ConvertToSjisFromUnicode(std::string & sjisString, String ^ unicodeString) {
    array<unsigned char> ^ charArray = System::Text::Encoding::GetEncoding("Shift_JIS")->GetBytes(unicodeString);
    sjisString.assign(charArray->Length, 0);
    for ( int index = 0; index < charArray->Length; ++index ) {
        sjisString[index] = charArray[index];
    }
}

この後、 sjisString.c_str() で取り出します。

http://vene.wankuma.com/prog/CppCli_strings.aspx
こちらで紹介されていた方法だと

System::Void ConvertToSjisFromUnicode(std::string & sjisString, String ^ unicodeString) {
    IntPtr mptr = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(unicodeString);
    sjisString = static_cast<const char *>(mptr.ToPointer());
    System::Runtime::InteropServices::Marshal::FreeHGlobal(mptr);
}

for で一文字ずつコピーするのが無くなってスマートな感じがします。