2017-02-17 18 views
0

Использование Delphi 2010, я пытаюсь написать dll для mIRC. Вот некоторая информация из файла справки MircСоздание dll для mIRC с использованием Delphi 2010

Технические примечания

Этот раздел содержит техническую информацию для программистов, которые хотят создавать библиотеки DLL для использования с Mirc.

Процедура в DLL вызывается должна иметь вида:

INT __stdcall PROCNAME (HWND mWnd, HWND aWnd, символ * данные, символ * Parms, BOOL шоу, BOOL nopause)

mWnd это ручка главного окна mIRC.

aWnd - это дескриптор окна, в котором выдается команда, это может быть не активное окно, если команда вызывается удаленным скриптом.

данные - это информация, которую вы хотите отправить в DLL. При возврате DLL может заполнить эту переменную командой, которую хочет выполнить mIRC, если таковая имеется.

DLL, может возвращать целое число, чтобы указать, что он хочет Mirc сделать:

0 означает, что Mirc должен/привал обработки

1 означает, что Mirc следует продолжить обработку

2 означает, что он заполнил переменную данных командой, которую он хочет выполнить mIRC, и заполнил парты параметрами для использования, если они есть, при выполнении команды.

3 означает, что DLL заполнила переменную данных результатом, который должен возвращать $ dll() в качестве идентификатора.

Следующий код, который должен отменить ввод текста, компилирует ОК, но результаты использования dll не то, что я ожидал.

function Reverse(mWnd, aWnd: hWnd; Data, Parms: PChar; Show, NoPause: Boolean): Integer; stdcall; 
var 
    Temp: String; 
    I: Integer; 
begin 
    SetLength(Temp, Length(Data)); 
    for I := 0 to Length(Data) do 
    begin 
    Temp[I] := Data[Length(Data)- I]; // Reversing string by retrieving characters from Data one at a time 
    end; 
    StrCopy(Data, PChar(Temp)); // Putting reversed string back into data 
    Result := 3; 
end; 
exports 
    Reverse; 
begin 
end. 

Например, вызывающего DLL из Mirc как //say $dll(mydll,Reverse,hello) дает выход только «о». Если параметр «hello sailor», выход будет «orilsao llhe». Я безуспешно пытался отслеживать работу кода, но я не могу понять, как изменяется значение Data. Я подозреваю, что моим собственным ограниченным знанием поведения PChar является способствующий фактор. Я приветствую любые советы, которые могут помочь. Cheers

+0

Boolean is wrong. Используйте LongBool. Или BOOL. Строки должны быть PAnsiChar, а не PWideChar. Об этом много раз говорили здесь. –

+0

Возможно, это обсуждалось так много раз, но поиски пропустили все это. Во время моего поста я не искал здесь для поведения PChar в версиях Delphi после Delphi7, и почему бы мне?Сначала я думал, что должен делать что-то неправильно. У меня нет ваших знаний, поэтому я вставил код. Я думал, что это проблема. Мало что я вспомнил о памяти и указателях, сосредоточил меня на том, как часы отладки ведут себя так по-разному в Delphi 7 против Delphi 2010. Cheers. – grasshopper

+0

Вы должны прочитать документацию. Изменение Unicode было огромным и очень документированным. Не экономьте на поддержании актуальности. –

ответ

0

Я изменил PChar на PAnsiChar в определение функции. function Reverse(mWnd, aWnd: hWnd; Data, Parms: PAnsiChar; Show, NoPause: Boolean): Integer; stdcall;

Я изменил PChar на PAnsiChar в строке StrCopy(Data, PChar(Temp)); // Putting reversed string back into data, и теперь моей проблемы больше нет. Просто немного больше, я могу внести изменения. Фактически запись моей проблемы на этом форуме помогла мне в нулевом решении.

Приветствия, и спасибо.

+0

Вам все равно нужно изменить 'Boolean' на' BOOL', как сказал вам Дэвид. 'Boolean' - 1 байт,' BOOL' - 4 байта. При переводе между языками. всегда используйте одинаковые имена типов данных, когда это возможно. У Delphi есть определение для BOOL для совместимости с другими API, которые также используют BOOL, так как это [стандартный тип данных Win32] (https://msdn.microsoft.com/en-us/library/windows/desktop /aa383751.aspx). –