Я надеюсь, что кто-то может помочь мне с проблемой, с которой я сейчас сталкиваюсь. У нас много унаследованного кода Delphi, и нам необходимо преобразовать некоторые из наших приложений Delphi в C #.
Устаревший код, с которым я сейчас борюсь, - это вызов функции из не-COM DLL стороннего приложения.
Вот заголовок и структура в стиле C, используемые для конкретной функции:
/*** C Function AwdApiLookup ***/
extern BOOL APIENTRY AwdApiLookup( HWND hwndNotify, ULONG ulMsg,
BOOL fContainer, CHAR cObjectType,
SEARCH_CRITERIA* searchCriteria,
USHORT usCount, USHORT usSearchType,
VOID pReserved );
/*** C Struct SEARCH_CRITERIA ***/
typedef struct _search_criteria
{
UCHAR dataname[4];
UCHAR wildcard;
UCHAR comparator[2];
UCHAR datavalue[75];
} SEARCH_CRITERIA;
В нашем Delphi-коде мы преобразовали вышеуказанную функцию и структуру следующим образом:
(*** Delphi implementation of C Function AwdApiLookup ***)
function AwdApiLookup(hwndNotify: HWND; ulMsg: ULONG; fContainer: Boolean;
cObjectType: Char; pSearchCriteria: Pointer; usCount: USHORT;
usSearchType: USHORT; pReserved: Pointer): Boolean; stdcall;
external 'AWDAPI.dll';
(*** Delphi implementation of C Struct SEARCH_CRITERIA ***)
TSearch_Criteria = record
dataname: array [0..3] of char;
wildcard: char;
comparator: array [0..1] of char;
datavalue: array [0..74] of char;
end;
PSearch_Criteria = ^TSearch_Criteria;
и способ, которым мы называем вышеупомянутый код в Delphi:
AwdApiLookup(0, 0, true, searchType, @criteriaList_[0],
criteriaCount, AWD_USE_SQL, nil);
, где attributeList определяется как
criteriaList_: array of TSearch_Criteria;
После всего, что сказано и сделано, мы можем теперь взглянуть на код C #, который я не могу заставить работать. Я уверен, что я делаю что-то не так, или мой заголовок C не переведен правильно. Мой проект компилируется правильно, но когда вызывается функция, я получаю значение «FALSE», которое указывает, что функция не выполнялась правильно в DLL.
Мой код C # на данный момент:
/*** C# implementation of C Function AwdApiLookup ***/
DllImport("awdapi.dll", CharSet = CharSet.Auto)]
public static extern bool AwdApiLookup(IntPtr handle, ulong ulMsg,
bool fContainer, char cObjectType,
ref SearchCriteria pSearchCriteria,
ushort usCount, ushort usSearchType,
Pointer pReserverd);
/*** C# implementation of C Struct SEARCH_CRITERIA ***/
[StructLayout(LayoutKind.Sequential)]
public struct SearchCriteria
{
private readonly byte[] m_DataName;
private readonly byte[] m_Wildcard;
private readonly byte[] m_Comparator;
private readonly byte[] m_DataValue;
public SearchCriteria(string dataName, string comparator, string dataValue)
{
m_DataName = Encoding.Unicode.GetBytes(
dataName.PadRight(4, ' ').Substring(0, 4));
m_Wildcard = Encoding.Unicode.GetBytes("0");
m_Comparator = Encoding.Unicode.GetBytes(
comparator.PadRight(2, ' ').Substring(0, 2));
m_DataValue = Encoding.Unicode.GetBytes(
dataValue.PadRight(75, ' ').Substring(0, 75));
}
public byte[] dataname { get { return m_DataName; } }
public byte[] wildcard { get { return m_Wildcard; } }
public byte[] comparator { get { return m_Comparator; } }
public byte[] datavalue { get { return m_DataValue; } }
}
Мой вызов C # для функции C # выглядит следующим образом
var callResult = UnsafeAwdApi.CallAwdApiLookup(IntPtr.Zero, 0, true, 'W',
ref searchCriteria[0], criteriaCount,
66, null);
, где searchCriteria и attributeCount определяется как
List<SearchCriteria> criteriaList = new List<SearchCriteria>();
var searchCriteria = criteriaList.ToArray();
var criteriaCount = (ushort)searchCriteria.Length;
и добавление данных в критерии поиска:
public void AddSearchCriteria(string dataName, string comparator, string dataValue)
{
var criteria = new SearchCriteria();
criteria.DataName = dataName;
criteria.Wildcard = "0";
criteria.Comparator = comparator;
criteria.DataValue = dataValue;
criteriaList.Add(criteria);
}
Как я уже сказал, мой код компилируется правильно, но когда функция выполняется, она возвращает «FALSE», что не должно иметь место, поскольку функция Delphi действительно возвращает данные с точно таким же вводом.
Я знаю, что я определенно что-то делаю не так, и я попробовал пару вещей, но, похоже, ничего не работает.
Любая помощь или толчок в правильном направлении будет принята с благодарностью.
Спасибо, Риан