Re[3]: Обмен данными между MFC DLL и C#
От: _FRED_ Черногория
Дата: 17.11.10 09:36
Оценка: 4 (1) +1
Здравствуйте, k.o., Вы писали:

KO>Нужно ещё тип поменять на int (BOOL в WinAPI это typedef на int)


Менять не нужно, я бы [return: MarshalAs(UnmanagedType.Bool)] добавил конечно, хотя именно так и происходит по-умолчанию.
Help will always be given at Hogwarts to those who ask for it.
Обмен данными между MFC DLL и C#
От: SetTom Россия  
Дата: 16.11.10 19:27
Оценка:
Есть dll написанная в MFC, в ней одна функция описана как
extern "C" __declspec(dllexport) const BOOL __cdecl Encrypt(CassetProperty* lpPostData, TCHAR *returnBuffer)


В ней CassetProperty — структура
typedef struct CassetProperty {
    int year;
    int month;
    int day;
    int hour;
    int minute;
    int number;
    int type;
    int line;
};

В функцию загоняется структура, а возвращается строка. Перекопал много статей, но чего-то не докручиваю все равно, потому как постоянно вылетаю с ошибкой "Была сделана попытка загрузить программу, имеющую неверный формат."
Пытаюсь делать так
public partial class Form1 : Form
    {
        [DllImport("CassetEncrypter.dll", SetLastError = true)]
        private static extern bool Encrypt(CassetProperty postData, ref StringBuilder data);    
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            CassetProperty test;
            test.year = 2010;
            test.month = 11;
            test.day = 16;
            test.hour = 14;
            test.minute = 29;
            test.number = 5;
            test.line = 1;
            test.type = 2;

            int length = 10;
            StringBuilder sb = new StringBuilder(length);
            if (Encrypt(test, ref sb))
            {
                // do something useful
            }
        }        
    }


Если ввести те параметры CassetProperty, что в примере, то dll должна вернуть строку "8036392812".
В тестовой проге на MFC все замечательно работает.
Проект тут http://files.rsdn.ru/43869/mfcdlltest.zip
Re: Обмен данными между MFC DLL и C#
От: _FRED_ Черногория
Дата: 17.11.10 07:48
Оценка:
Здравствуйте, SetTom, Вы писали:

ST>Есть dll написанная в MFC, в ней одна функция описана как

ST>extern "C" __declspec(dllexport) const BOOL __cdecl Encrypt(CassetProperty* lpPostData, TCHAR *returnBuffer)


ST>Пытаюсь делать так

[cs]
ST>        [DllImport("CassetEncrypter.dll", SetLastError = true)]
ST>        private static extern bool Encrypt(CassetProperty postData, ref StringBuilder data);
[/cs]

Функция ожидает указатель на структуру, а вы ей передаёте копию экземпляра структуры. Где вы видели пример интеропа StringBuilder через ref?
[DllImport("CassetEncrypter.dll", SetLastError = true)]
private static extern bool Encrypt(ref CassetProperty postData, [Out] StringBuilder data);


Почитайте аккуратно и внимательно Marshaling Data with Platform Invoke
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Обмен данными между MFC DLL и C#
От: k.o. Россия  
Дата: 17.11.10 09:27
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, SetTom, Вы писали:


ST>>Есть dll написанная в MFC, в ней одна функция описана как

_FR>
ST>>extern "C" __declspec(dllexport) const BOOL __cdecl Encrypt(CassetProperty* lpPostData, TCHAR *returnBuffer) 
_FR>


_FR>Функция ожидает указатель на структуру, а вы ей передаёте копию экземпляра структуры. Где вы видели пример интеропа StringBuilder через ref?

_FR>
_FR>[DllImport("CassetEncrypter.dll", SetLastError = true)]
_FR>private static extern bool Encrypt(ref CassetProperty postData, [Out] StringBuilder data);
_FR>


_FR>Почитайте аккуратно и внимательно Marshaling Data with Platform Invoke


Нужно ещё тип поменять на int (BOOL в WinAPI это typedef на int) и задать правильное соглашение о вызове (по умолчанию будет stdcall):

[DllImport("CassetEncrypter.dll", CallingConvention = CallingConvention.Cdecl, SetLastError = true)]
private static extern int Encrypt(ref CassetProperty postData, [Out] StringBuilder data);
Re[2]: Обмен данными между MFC DLL и C#
От: SetTom Россия  
Дата: 17.11.10 09:29
Оценка:
Спасибо, заработало!
Статью изучу на досуге.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.