Есть dll на C++, в ней функция, которую вызываю из C#
Получаю маленькую фигню с указателями.
Итак, в dll (C++) определена структура и ф-ия:
// Просто определяем структуру
class ST
{
public:
char* ptr;
int t;
};
DLLFORSHARP_API int Test(ST& st, char* ptr )
{
ofstream of;
of.open( "c:/testdll.txt" );
// Выводим в файл указатель переданый в структуре, и указатель, переданый в стеке.
stringstream ss2;
ss2 << hex << (int)st.ptr << " " << (int)ptr;
of << ss2.str().c_str() << endl;
// Выводим строчку из структуры
string s( st.ptr );
of << s.c_str() << endl;
// Выводим строчку из стека
string s2( ptr );
of << s2.c_str() << endl;
// Для проверки выводим число
stringstream ss;
ss << st.t;
of << ss.str().c_str();
of.close();
return s.size();
}
---
В тестовой програме на C# написан следующий код:
struct ST
{
public byte[] ptr;
public int t;
};
class Program
{
[DllImport("dllForSharp.dll")]
public static extern int Test(ref ST param, byte[] param2);
static void Main(string[] args)
{
string test = "kuku";
ST st;
st.ptr = System.Text.ASCIIEncoding.Default.GetBytes(test);
st.t = 105;
// В структуре, и во втором параметре у нас один и тот же "указатель"
Test(ref st, st.ptr);
}
---
И получаем такой вот результат:
12c9ac0 15776c0
kuku
105
1. Число вывелось верно - структура передалась верно (ничего не съехало, байтики в нужной последовательности)
2. Строка kuku, переданая во втором параметре вывелась верно - byte[] вполне валидно можно рассматривать как сишный char*
3. Внимание вопрос: как оказалось, что st.ptr в структуре отлично от st.ptr во втором параметре ???
Внутри структуры это 12c9ac0, в в параметре 15776c0. Хотя передавал одно и то же:
st.ptr = System.Text.ASCIIEncoding.Default.GetBytes(test);
Test(ref st, st.ptr);
Пока никаких идей.
|