Здравствуйте, k.o., Вы писали:
KO>Нужно ещё тип поменять на int (BOOL в WinAPI это typedef на int)
Менять не нужно, я бы [return: MarshalAs(UnmanagedType.Bool)] добавил конечно,
хотя именно так и происходит по-умолчанию.
Есть 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
Здравствуйте, 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
Здравствуйте, _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);