как правильно получить результ функции из DLL
От: asemchuk  
Дата: 17.06.05 17:17
Оценка:
Добрый вечер!

У меня есть чледующая проблема ...
есть некоторая DLL в которой находиться вот такая функция ...

DWORD CASGetUsersByApp( LPCTSTR pszBusinessName,
LPCTSTR pszLastNameSearch,
AuthService::UserInfo** puiUsers,
DWORD* pdwSize
)

Так вот здесь puiUsers передается по **

я сл. образом перенес это в С#

[StructLayout(LayoutKind.Auto)]
public class UserInfo
{
[MarshalAs(UnmanagedType.BStr)]
public string _domainName;
[MarshalAs(UnmanagedType.BStr)]
public string _firstName;
[MarshalAs(UnmanagedType.BStr)]
public string _middleName;
[MarshalAs(UnmanagedType.BStr)]
public string _lastName;

public UserInfo() {}
}

[DllImport("CASAgentA.dll", CharSet=CharSet.Ansi, SetLastError=true, EntryPoint "CASGetUsersByApp")]
private extern static int CASGetUsersByAppA( string strBSCode, string strBusinessSystemCode, ref UserInfo[] parrUsers , ref int Size );

Внутри сишного кода, идет нормальное заполнение этой структуры ...
Она заполняется, все нормально, а когда мы покидаем сишный код, то получаем сл. вылетает ексепшн в, котором написано мол Object reference not set to an instance of an object.

Кто знает в чем дело ? помогите плиз ...
Если есть более елегантное решение это даже лучше ... =)

Заранее благодарен ..
Errare est humanum, errare est humanum
Re: как правильно получить результ функции из DLL
От: adontz Грузия http://adontz.wordpress.com/
Дата: 17.06.05 17:20
Оценка:
Здравствуйте, asemchuk, Вы писали:

A>[DllImport("CASAgentA.dll", CharSet=CharSet.Ansi, SetLastError=true, EntryPoint "CASGetUsersByApp")]

A>private extern static int CASGetUsersByAppA( string strBSCode, string strBusinessSystemCode, ref UserInfo[] parrUsers , ref int Size );

Как минимум надо ref на out заменить. К тому же у вас CASGetUsersByAppA а передаются string (а они unicode'ные). Может ещё что-то есть...
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: как правильно получить результ функции из DLL
От: asemchuk  
Дата: 17.06.05 17:26
Оценка:
Здравствуйте, adontz, Вы писали:

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


A>>[DllImport("CASAgentA.dll", CharSet=CharSet.Ansi, SetLastError=true, EntryPoint "CASGetUsersByApp")]

A>>private extern static int CASGetUsersByAppA( string strBSCode, string strBusinessSystemCode, ref UserInfo[] parrUsers , ref int Size );

A>Как минимум надо ref на out заменить. К тому же у вас CASGetUsersByAppA а передаются string (а они unicode'ные). Может ещё что-то есть...


С out я пробовал, та же ошибка + еще одна из серии Unhandled вылетает ...
С передачей параметров все норм, я их в сишном коде проверял, что-то имено с этой структурой не так ...
Errare est humanum, errare est humanum
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.