| Структура программирования, программирование, языки программирования, книги программирование | На сайте представлена информация про программирование в Интернете и работу |
|
Создание Диалога помогите..., когда я принимаю от клиента информацию: Как получить список компов с Active Directory Как узнать номер BIOS?, 9х and NT Автозагрузка, реестр Как отловить scroll компонента StringGrid. Как убрать звук при нажатии клавиши Enter, в TDateTimePicker Кто знает , где есть grid с автофильтром? БД в Делфи, проблема с BDE Сканирование портов Как Вы относитесь к курящим девушкам? Экспорт функций TDump.exe TListBox Отслеживание кликов по пунктам ТCheckListBox? listview, цвет... Навскидку ответите?, задачка на внимательность ODAC - использование TOraQuery Как вернуть датасет хранимой процедурой?, См. название OpenGL mdb в Delphi, Подключение к базе Access Как в QuickRep создать отчет состоящий из 2 стр., склеить две страницы потом можно было Прошу совета!, В какой прог. создать AVI для интерфейса Кодировки Запихивание форм в DLL, нужна инфа.... mysql??? Счетчик Помогите с кодом hint, но не простой Как отлаживать ActiveX? Как поставить русский шрифт в Pascal?, Маленькая проблеммка!.. Слияние массивов сеть..., сеть.... программы..., как мне узнать ID запущенных программ... Одна странность Каким файловым менеждером пользуетесь?, only programmers Определение дескриптора Форматирование имени обьекта Как разрешить ввод только цифр?, Как запретить ввод букв? Чтение ИНИ-файла? Поиск файлов, КАК? Шифрование данных, в ini файлах Многострочный ввод/вывод Западлостроение, Для программ шуток под NT как сделать пробник для порта Размер шрифта, при выводе текста под углом Размеры картинки, чтобы всю видно было... ПОМОГИТЕЕЕЕЕЕ, СОС ключ. слово assembler Стрелочные часы через Canavas Формы. OpenGL & DelphiX, Можно ли... Как Delphi привязать к Wordy ? Организация соединения по протоколу SET или SLL CD-ROM, Блокировка/Разблокировка Как в буфер обмена запихнуть rtf?, Снова нужна помощь добрых людей Как Вы относитесь к курящим девушкам? Crystal Report 8.5 - не работает RTF экспорт Работа с Active Directory Нужна информация по QReport., С чего начать? Путь к EXE, Как узнать путь к программе Как Вы относитесь к курящим девушкам? Как по наведению мышки включать анимацию в Animatе, (Если св-ва OnMouseMove у TAnimatе нет) Список дисков равен списку пунктов меню. Преобразование типов Не понятно почему выдает AV!!!, TQRLabel(FindComponent('QR' ..... Video RAM, Определение размера видеопамяти Как перескакивать с одного Edit в другой по клику? Программирование удаленный доступ, Программирование удаленный доступ Delphi+MySql+host Rave5, Использование Rave 5 на Delphi7 |
Платные хостинги Раскрутка сайта Книги по программированию Экспорт функций
- помогите, пожалуйста, разобраться с экспортом:unit TcpTable;interfacetypePMIB_TCPROW=^TMIB_TCPROW;//указатель на структуру TMIB_TCPROWTMIB_TCPROW=record //в описании на C применяется тип DWORD - какой аналог в Delphi?(я пробовал Word) dwState:Word; //состояние соединения dwLocalAddr:Word; //Локальный адресс dwLocalPort:Word; //Локальный порт dwRemoteAddr:Word;//Удаленный адресс dwRemotePort:Word;//Удаленный порт end;PMIB_TCPTABLE=^TMIB_TCPTABLE;//указатель на структуру TMIB_TCPTABLETMIB_TCPTABLE=record dwNumEntries:Word; //количество строк в поле table table:PMIB_TCPROW;//указатель на массив структур типа MIB_TCPROW, содержащих информацию о TCP-соединениях end;//так описана на С//////////////////////////////////typedef struct _MIB_TCPTABLE{ DWORD dwNumEntries; MIB_TCPTABLE table[ANY_SIZE];} MIB_TCPTABLE, *PMIB_TCPTABLE;//////////////////////////////////{$EXTERNALSYM GetTcpTable}function GetTcpTable(TcpTable:PMIB_TCPTABLE;buf:PChar;bOrder:Boolean):Word;implementationfunction GetTcpTable; external 'Iphlpapi.dll' name 'GetTcpTable';end.Компилируется нормально, но при вызове функции происходит самая распространенная ошибка - 'Access Violation' и переходит к окну CPU. - 1) DWORD - аналог Longword2) Не понятно что ты делаешь, во всяком случае это похоже на импорт, а никак не экспорт, скорее всего надо так:Код unit TcpTable;interfacetype...{здесь ты её родимую объявляешь}function GetTcpTable(TcpTable:PMIB_TCPTABLE;buf:PChar;bOrder:Boolean):Word;external 'Iphlpapi.dll' name 'GetTcpTable';implementationProcedure MyFunction;begin{здесь ты её используешь} i:=GetTcpTable(g,f,d);end;end.highlightSyntax('delphiYTljZD','delphi');PS. Удивительно что компиллятор пропустил такой кодPPS. Возможно что объявлять надо немного не так, а вот так:function GetTcpTable(TcpTable:PMIB_TCPTABLE;buf:PChar;bOrder:Boolean):Word;stdcall;external 'Iphlpapi.dll' name 'GetTcpTable';Связано это с тем что скорее всего phlpapi.dll написана не на Delphi, если я не прав, тогда надо использовать другую соответствующую директиву. - Да я имелл ввиду импорт)))) Меня интересует, что означает вот такая записьMIB_TCPTABLE table[ANY_SIZE]; - что за ANY_SIZE(Наскоко я онимаю это размер массива) и как его узнать? Или это динамический массив Я с 'Си' не работал и не знаю обьявления его массивов(((Вызов функции не стал приводить к ошибке после добавления stdcall, но если после этого обратиться к элементу массива то происходит Access Violetion.varmass:PMIB_TCPTABLE;tryNew(mass);GetTcpTable(mass,PChar(mass),False);ShowMessage(IntToStr(mass.MIB_TCPROW[0].dwLocalPort));finallyDispose(mass);end; - Наверное имеется ввиду открытый массив. Размер его задаётся динамически функцией SetLength, узнать размер массива можно при помощи функции Lenght - Что-то ты эту структуру странно перевел. Если на С она выглядит так:typedef struct _MIB_TCPTABLE{ DWORD dwNumEntries; MIB_TCPTABLE table[ANY_SIZE];} MIB_TCPTABLE, *PMIB_TCPTABLE;то в паскале ее следует записать так:TMIB_TCPTABLE=packed record dwNumEntries:LongWord; table:array [0..ANY_SYZE] of TMIB_TCPTABLE;end;Хотя про packed с уверенностью не скажу - незнаю как выравневается исходная структура, но скорее всего так. ANY_SIZE скорее всего имя макроса, в крайнем случае - константа. В любом случае это определенное число.Можно член table сделать и указателем, но тогда не забывай выделять память под него. И открытый массив тоже подойдет - он тоже указатель, но опять же память выделять надо. - Вот поетому я и задал вопрос про ANY_SIZE, поскольку не знал как нада етот код перевести на Delphi. Спасибо за оказанную помощ. - И все таки это все не хочет работать(((. Что сдесь может быть не так? Начну сначала и попорядку;функция GetTcpTable предназначена для получении информации о таблице TCP-соединений(описание на C):DWORD GetTcpTable( PMIB_TCPTABLE pTcpTable, PDWORD pdwSize, BOOL bOrder);Параметр pTcpTable - указатель на буфер MIB_TCPTABLE, в который будет помещена информация о TCP-соединениях. Параметр pwdSize - указатель на переменную, задающую размер буфера. Если размер буфкра не достаточно большой, то функция передаст в этом параметре требуемый размер. Параметр bOrder указывает, нужно ли сортировать информацию.///////////////////////////////////////////////////////////////////Я описал так:function GetTcpTable(TcpTable:PMIB_TCPTABLE;Size:PChar;bOrder:Boolean):LongWord;stdcall;///////////////////////////////////////////////////////////////////Возвращаемая структура MIB_TCPTABLE имеет вид:typedef struct _MIB_TCPTABLE{ DWORD dwNumEntries; MIB_TCPROW table[ANY_SIZE];} MIB_TCPTABLE, *PMIB_TCPTABLE;Она содержит следующие поля:dwNumEntries - количество строк в поле table;table - указатель на массив структур типа MIB_TCPROW, содержащих информацию о TCP-соединениях.////////////////////////////////////////Я описал так:PMIB_TCPTABLE=^TMIB_TCPTABLE;TMIB_TCPTABLE=packed record dwNumEntries:LongWord; table:array[0..64] of TMIB_TCPROW; end;////////////////////////////////////////Структура MIB_TCPROW содержит информацию о парах IP-адресов, образующих соединение:typedef struct _MIB_TCPROW{ DWORD dwState; DWORD dwLocalAddr; DWORD dwLocalPort; DWORD dwRemoteAddr; DWORD dwRemotePort;} MIB_TCPROW, *PMIB_TCPROW;эта структура содержит следующие поля;dwState - состояние данного TCP-соединения.dwLocalAddr - локальный IP-адрес данного соединения;dwLocalPort - локальный порт данного соединения;dwRemoteAddr - внешний IP-адрес данного соединения;dwRemotePort - внешний порт данного соединения;////////////////////////////////////////я описал так:PMIB_TCPROW=^TMIB_TCPROW;TMIB_TCPROW=record dwState:LongWord; dwLocalAddr:LongWord; dwLocalPort:LongWord; dwRemoteAddr:LongWord; dwRemotePort:LongWord; end;////////////////////////////////////////импорт:function GetTcpTable(TcpTable:TMIB_TCPTABLE;Size:PChar;bOrder:Boolean):LongWord;stdcall;external 'Iphlpapi.dll' name 'GetTcpTable';При вызове функции ошибок нет, но она ни чего не возвращает(((((Пожалуйста, подскажите где я ошибся. - А может так:Type PDWord=^Longword;...function GetTcpTable(TcpTable:PMIB_TCPTABLE;Size:PDWord;bOrder:Integer):LongWord;stdcall;external 'Iphlpapi.dll' name 'GetTcpTable';И как ты ее вызываешь. И нет ли способа узнать что за ошибка возвращается? - Вот так вызываю, но ни каких результатов:m:PMIB_TCPTABLE;p:PDWord;begintry New(m); New(p); p^:=SizeOf(m); GetTcpTable(m,p,False); ShowMessage(IntToStr(m.table[0].dwState));//сдесь возникает Access Violetionfinally Dispose(p); Dispose(m);end; - Ты уверен, что надо передавать размер указателя? Это всего 4 байта.Цитата ShowMessage(IntToStr(m.table[0].dwState));//сдесь возникает Access VioletionА надо так:ShowMessage(IntToStr(m^.table[0].dwState)); //зсдесь его не будет - Все равно происходит Access Violetion:varm:PMIB_TCPTABLE;ps:PDWord;begintry New(m); New(ps); ps^:=SizeOf(TMIB_TCPTABLE); GetTcpTable(m,ps,False); ShowMessage(IntToStr(m^.table[0].dwState));finally Dispose(ps); Dispose(m);end; - Ладно, значит, наверное, статические массивы там не так храняться. Поторобуй так:Код TMIB_TCPTABLE=record dwNumEntries:LongWord; table:array of TMIB_TCPROW;end;varm:PMIB_TCPTABLE;ps:PDWord;begin try New(m); SetLength(m^.table,64); New(ps); ps^:=SizeOf(TMIB_TCPTABLE); GetTcpTable(m,ps,False); ShowMessage(IntToStr(m^.table[0].dwState)); finally Dispose(ps); SetLength(m^.table,0); Dispose(m); end;highlightSyntax('delphiODA5ND','delphi');или так:Код TMIB_TCPTABLE=record dwNumEntries:LongWord; table:PMIB_TCPROW;end;varm:PMIB_TCPTABLE;ps:PDWord;begin try New(m); GetMem(m^.table,SizeOf(TMIB_TCPROW)*64); New(ps); ps^:=SizeOf(TMIB_TCPTABLE); GetTcpTable(m,ps,False); ShowMessage(IntToStr(m^.table[0].dwState)); finally Dispose(ps); FreeMem(m^.table); Dispose(m); end;highlightSyntax('delphiWJlYjgz','delphi'); - При таком варианте ошибки нету только в элементе массива с индексом 0 и возвращаемые данные dwNumEntries неправильные! - Вот я нашел код на 'С':// Get the table of TCP endpoints // dwSize = 0; error = GetTcpTable( NULL, &dwSize, TRUE ); if( error != ERROR_INSUFFICIENT_BUFFER ) { printf("Failed to snapshot TCP endpoints.\n"); PrintError( error ); return -1; } tcpTable = (PMIB_TCPTABLE) malloc( dwSize ); error = GetTcpTable( tcpTable, &dwSize, TRUE ); if( error ) { printf("Failed to snapshot TCP endpoints.\n"); PrintError( error ); return -1; } - tcpTable = (PMIB_TCPTABLE) malloc( dwSize );Как это можно перевести в Дельфи? |