Определение в СLARION mac_aдреса cетевого компа.
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Определение в СLARION mac_aдреса cетевого компа.
Всем привет!
Есть ли возможность определить MAC_aдрес(а) на сетевом(ых) компе(ах) из Clarion (посредством WinApi или к-л. доп. библиотекой)?
Есть ли возможность определить MAC_aдрес(а) на сетевом(ых) компе(ах) из Clarion (посредством WinApi или к-л. доп. библиотекой)?
- WadimZapara
- Активист
- Сообщения: 181
- Зарегистрирован: 11 Июнь 2008, 12:11
- Откуда: Тамбов
Re: Определение в СLARION mac_aдреса cетевого компа.
Если есть возможность в Винде, то есть возможность и в Кларе.
Надо лезть в MSDN. Мне не было надобности. Не подскажу
Надо лезть в MSDN. Мне не было надобности. Не подскажу
Компьютер имеет то преимущество перед мозгом, что им пользуются...
- Admin
- Администратор
- Сообщения: 3996
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 46 раз
- Поблагодарили: 26 раз
- Контактная информация:
Re: Определение в СLARION mac_aдреса cетевого компа.
Гуглим господа хорошие.Aнтон87 писал(а):Всем привет!
Есть ли возможность определить MAC_aдрес(а) на сетевом(ых) компе(ах) из Clarion (посредством WinApi или к-л. доп. библиотекой)?
http://www.google.com/search?hl=ru&clie ... indows+API
Находим код и портируем его в Кларион...
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
-
- Новичок
- Сообщения: 13
- Зарегистрирован: 29 Сентябрь 2006, 6:33
- Откуда: Ташкент
- Контактная информация:
Re: Определение в СLARION mac_aдреса cетевого компа.
Нашел рабочий код на С, работает даже с Vista. Теперь надо будет его на Кларион перевести или смастерить DLLку чтобы вызывать из клариона:
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x)) /* Note: could also use malloc() and free() */
int main()
{
DWORD dwSize = 0;
DWORD dwRetVal = 0;
int i, j;
/* variables used for GetIfTable and GetIfEntry */
MIB_IFTABLE *pIfTable;
MIB_IFROW *pIfRow;
// Allocate memory for our pointers.
pIfTable = (MIB_IFTABLE *) MALLOC(sizeof (MIB_IFTABLE));
if (pIfTable == NULL) {
printf("Error allocating memory needed to call GetIfTable\n");
exit (1);
}
// Before calling GetIfEntry, we call GetIfTable to make
// sure there are entries to get and retrieve the interface index.
// Make an initial call to GetIfTable to get the
// necessary size into dwSize
dwSize = sizeof (MIB_IFTABLE);
if (GetIfTable(pIfTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
FREE(pIfTable);
pIfTable = (MIB_IFTABLE *) MALLOC(dwSize);
if (pIfTable == NULL) {
printf("Error allocating memory\n");
exit (1);
}
}
// Make a second call to GetIfTable to get the actual
// data we want.
if ((dwRetVal = GetIfTable(pIfTable, &dwSize, 0)) == NO_ERROR) {
if (pIfTable->dwNumEntries > 0) {
pIfRow = (MIB_IFROW *) MALLOC(sizeof (MIB_IFROW));
if (pIfRow == NULL) {
printf("Error allocating memory\n");
if (pIfTable != NULL) {
FREE(pIfTable);
pIfTable = NULL;
}
exit (1);
}
printf("\tNum Entries: %ld\n\n", pIfTable->dwNumEntries);
for (i = 0; i < (int) pIfTable->dwNumEntries; i++) {
pIfRow->dwIndex = pIfTable->table.dwIndex;
if ((dwRetVal = GetIfEntry(pIfRow)) == NO_ERROR) {
printf("\tIndex:\t %ld\n", pIfRow->dwIndex);
printf("\tInterfaceName[%d]:\t ", i);
if (pIfRow->wszName != NULL)
printf("%ws", pIfRow->wszName);
printf("\n");
printf("\tDescription[%d]:\t ", i);
for (j = 0; j < (int) pIfRow->dwDescrLen; j++)
printf("%c", pIfRow->bDescr[j]);
printf("\n");
printf("\tType[%d]:\t ", i);
switch (pIfRow->dwType) {
case IF_TYPE_OTHER:
printf("Other\n");
break;
case IF_TYPE_ETHERNET_CSMACD:
printf("Ethernet\n");
break;
case IF_TYPE_ISO88025_TOKENRING:
printf("Token Ring\n");
break;
case IF_TYPE_PPP:
printf("PPP\n");
break;
case IF_TYPE_SOFTWARE_LOOPBACK:
printf("Software Lookback\n");
break;
case IF_TYPE_ATM:
printf("ATM\n");
break;
case IF_TYPE_IEEE80211:
printf("IEEE 802.11 Wireless\n");
break;
case IF_TYPE_TUNNEL:
printf("Tunnel type encapsulation\n");
break;
case IF_TYPE_IEEE1394:
printf("IEEE 1394 Firewire\n");
break;
default:
printf("Unknown type %ld\n", pIfRow->dwType);
break;
}
printf("\tMtu[%d]:\t\t %ld\n", i, pIfRow->dwMtu);
printf("\tSpeed[%d]:\t %ld\n", i, pIfRow->dwSpeed);
printf("\tPhysical Addr:\t ");
if (pIfRow->dwPhysAddrLen == 0)
printf("\n");
for (j = 0; j < (int) pIfRow->dwPhysAddrLen; j++) {
if (j == (pIfRow->dwPhysAddrLen - 1))
printf("%.2X\n", (int) pIfRow->bPhysAddr[j]);
else
printf("%.2X-", (int) pIfRow->bPhysAddr[j]);
}
printf("\tAdmin Status[%d]:\t %ld\n", i,
pIfRow->dwAdminStatus);
printf("\tOper Status[%d]:\t ", i);
switch (pIfRow->dwOperStatus) {
case IF_OPER_STATUS_NON_OPERATIONAL:
printf("Non Operational\n");
break;
case IF_OPER_STATUS_UNREACHABLE:
printf("Unreasonable\n");
break;
case IF_OPER_STATUS_DISCONNECTED:
printf("Disconnected\n");
break;
case IF_OPER_STATUS_CONNECTING:
printf("Connecting\n");
break;
case IF_OPER_STATUS_CONNECTED:
printf("Connected\n");
break;
case IF_OPER_STATUS_OPERATIONAL:
printf("Operational\n");
break;
default:
printf("Unknown status %ld\n",
pIfRow->dwAdminStatus);
break;
}
printf("\n");
}
else {printf("GetIfEntry failed for index %d with error: %ld\n",i, dwRetVal); }
}
} else { printf("\tGetIfTable failed with error: %ld\n", dwRetVal); }
}
exit (0);
}
- Игорь Столяров
- Ветеран движения
- Сообщения: 7680
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 26 раз
- Поблагодарили: 68 раз
Re: Определение в СLARION mac_aдреса cетевого компа.
Ну, если не хочется переводить код с C, читать MSDN или лазить в Google,
то см. http://www.klarisoft.com/KSNews_idx12.htm
то см. http://www.klarisoft.com/KSNews_idx12.htm
Make Clarion Great Again !
- Игорь Столяров
- Ветеран движения
- Сообщения: 7680
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 26 раз
- Поблагодарили: 68 раз
Re: Определение в СLARION mac_aдреса cетевого компа.
Типичный ответ программиста на Clarion ...
Не искать, не думать, не разбираться (Google, MSDN, код на C), а взять готовое решение (еще лучше шаблон),
вставить в свой код и забыть об этом раз и навсегда ... )
Не искать, не думать, не разбираться (Google, MSDN, код на C), а взять готовое решение (еще лучше шаблон),
вставить в свой код и забыть об этом раз и навсегда ... )
Make Clarion Great Again !
Re: Определение в СLARION mac_aдреса cетевого компа.
Согласен.
Кстати, тот пример на который дал ссылку не всегда и на всех рабочих станциях работает, и его еще надо дорабатывать. В нем (примере) помимо "чужого" кода нада вставить и "свой" код? чтобы заработало. Не все коту масленница.
Кстати, тот пример на который дал ссылку не всегда и на всех рабочих станциях работает, и его еще надо дорабатывать. В нем (примере) помимо "чужого" кода нада вставить и "свой" код? чтобы заработало. Не все коту масленница.
-
- Новичок
- Сообщения: 13
- Зарегистрирован: 29 Сентябрь 2006, 6:33
- Откуда: Ташкент
- Контактная информация:
Re: Определение в СLARION mac_aдреса cетевого компа.
Я рассматривал несколько вариантов,включая этот пример. Этот пример использует NetBEUI протокол, который был исключен из Виста, поэтому этот пример не годен для виста и последующих версий. Код на С работает 100% для всех виндовс версий, хотя информация выводится только об используемых LAN. Если кабель не подключен может и не вывестись. Зато главное работает. Было бы класно переделать его под кларион, у меня есть еще похожий С код для вытаскивания серийника HDD жесткого диска.
Самый правильный вариант вытаскивать информацию о железе через WMI. Вытаскивается вся инфорамация об используемых и неактивных устройвст. В Ingasoft имеется кстати библиотека за $30 для работы с WMI из клариона:
http://www.ingasoftplus.com/id119.htm
- morkovin
- Ветеран
- Сообщения: 910
- Зарегистрирован: 20 Июль 2005, 14:53
- Откуда: Volgograd, Russia
- Благодарил (а): 3 раза
- Поблагодарили: 3 раза
- Контактная информация:
Re: Определение в СLARION mac_aдреса cетевого компа.
Легко!Есть ли возможность определить MAC_aдрес(а) на сетевом(ых) компе(ах) из Clarion (посредством WinApi или к-л. доп. библиотекой)?
Всего-то и надо - MS SQL и внедрить малюсенькую прогу на юзеровские компы, чтобы эта прога коннектилась к какой-либо БД. А дальше ну совсем просто:
1. Создаем хранимку(например, WriteLogUsers) в нужной БД
SELECT convert(char(20),master.dbo.sysprocesses.nt_username) AS NetworkUserName,
convert(char(20),master.dbo.sysprocesses.loginame) AS LoginName,
convert(char(20),master.dbo.sysprocesses.login_time,113) AS LoginTime,
convert(char(20),master.dbo.sysdatabases.name) AS DatabaseName,
convert(char(20),master.dbo.sysprocesses.hostname) AS ComputerName,
convert(char(20),master.dbo.sysprocesses.net_address) AS MACAddress,
convert(char(20),master.dbo.sysprocesses.program_name) AS ProgramName
INTO Dbo.Users
FROM master.dbo.sysprocesses, master.dbo.sysdatabases
WHERE master.dbo.sysdatabases.dbid = master.dbo.sysprocesses.dbid
AND master.dbo.sysdatabases.name = '<yourdatabase>'
2. В DCT описываем таблицу Users:
NetworkUserName STRING 20 @s20
LoginName STRING 20 @s20
LoginTime STRING 20 @s20
DataBaseName STRING 20 @s20
ComputerName STRING 20 @s20
MACAddress STRING 20 @s20
ProgramName STRING 20 @s20
3. И делаем вызов где-нибудь в меню:
OPEN(DummyCnt)
OPEN(DummyStr)
CLEAR(DummyCnt)
DummyCnt{PROP:SQL}='DROP TABLE DBO.USERS'
NEXT(DUMMYCNT)
case errorcode()
of 0 ! данные получены
of 33 ! данных нет
BEEP(BEEP:SystemExclamation) ; YIELD()
of 90 ! ошибка SQL
stop(fileerror() & '<10>SQL: ' & DummyCnt{PROP:SQL})
else ! ошибка
stop(error() & '<10>Table: ' & name(DummyCnt))
end
CLEAR(DummyStr)
DummyStr{PROP:SQL}='NORESULTCALL WriteLogUsers'
NEXT(DUMMYSTR)
case errorcode()
of 0 ! данные получены
of 33 ! данных нет
BEEP(BEEP:SystemExclamation) ; YIELD()
of 90 ! ошибка SQL
stop(fileerror() & '<10>SQL: ' & DummyStr{PROP:SQL})
else ! ошибка
stop(error() & '<10>Table: ' & name(DummyStr))
end
BrowseUsers()
З.Ы. Использую эту технику для контроля подключения юзеров к БД
WBR, morkovin
Re: Определение в СLARION mac_aдреса cетевого компа.
Всем добрый день! Спасибо за информацию.
Это хорошо, что есть другой способ определения maс-адресов сетевых компов при наличие М SQL cервера. А это можно реализовать используя MS SQL или еще и в других SQL-серверах или без разницы ("по-барабану")? Заранее спасибо за ответ.
Это хорошо, что есть другой способ определения maс-адресов сетевых компов при наличие М SQL cервера. А это можно реализовать используя MS SQL или еще и в других SQL-серверах или без разницы ("по-барабану")? Заранее спасибо за ответ.
Re: Определение в СLARION mac_aдреса cетевого компа.
Я про, а существует ли в том же скажем MySQL или FireBird, в синтаксисе sql-команд "convert(char(20),master.dbo.sysprocesses.net_address) AS MACAddress" в системной базе master.mdf?
-
- Новичок
- Сообщения: 13
- Зарегистрирован: 29 Сентябрь 2006, 6:33
- Откуда: Ташкент
- Контактная информация:
Re: Определение в СLARION mac_aдреса cетевого компа.
Нет не существует, так как соединение идет через протокол TCP/IP, есть возможность оперделить IP адрес:Я про, а существует ли в том же скажем MySQL или FireBird, в синтаксисе sql-команд "convert(char(20),master.dbo.sysprocesses.net_address) AS MACAddress" в системной базе master.mdf?
SELECT inet_client_addr() ;
-
- Ветеран
- Сообщения: 311
- Зарегистрирован: 08 Июль 2005, 22:04
Re: Определение в СLARION mac_aдреса cетевого компа.
Да бог с ней с сетью.А можно ли в клаше просто без всяких наворотов
определить MAC-адрес своей карты или номер своего диска на локальном
компе.По поводу MAC,IP адресов удаленного устройства.Сам я прилично сталкивался
с этим при подключении сетевого принтера.Ну все это зависит от конкретной
модели принтера и подключение через IP -не надежно для сети с автоматичекой раздачей
IP-адресов через DHCP(в зависимости от последовательности включения компов вы можете
такой принтер и не увидеть,а статические сети,за которыми следят,это только у серьезных
юзеров).А так поставили вы у заказчика свою систему,а она и запомнит MAC, номер диска.
Захочет заказчик без вашего ведома перепродать вашу систему - не получится.Затеял сам перенос
на другой комп - тоже не получится,нужно будет вызвывать вас,а это работа,которая стоит денег и
спорить с этим трудно.Вот у 1С - вызвал специалиста - плати ему ~1500руб. в час.А сколько ему нужно
будет этих часов,знает один бог.Вот так они и вытесняют нас с рынка.Впарят систему задешо,а если что чуток
заглючит, то доберут своё в полной мере.Вот почему и есть устойчивый кадровый спрос на "программистов" 1С.
определить MAC-адрес своей карты или номер своего диска на локальном
компе.По поводу MAC,IP адресов удаленного устройства.Сам я прилично сталкивался
с этим при подключении сетевого принтера.Ну все это зависит от конкретной
модели принтера и подключение через IP -не надежно для сети с автоматичекой раздачей
IP-адресов через DHCP(в зависимости от последовательности включения компов вы можете
такой принтер и не увидеть,а статические сети,за которыми следят,это только у серьезных
юзеров).А так поставили вы у заказчика свою систему,а она и запомнит MAC, номер диска.
Захочет заказчик без вашего ведома перепродать вашу систему - не получится.Затеял сам перенос
на другой комп - тоже не получится,нужно будет вызвывать вас,а это работа,которая стоит денег и
спорить с этим трудно.Вот у 1С - вызвал специалиста - плати ему ~1500руб. в час.А сколько ему нужно
будет этих часов,знает один бог.Вот так они и вытесняют нас с рынка.Впарят систему задешо,а если что чуток
заглючит, то доберут своё в полной мере.Вот почему и есть устойчивый кадровый спрос на "программистов" 1С.
Re: Определение в СLARION mac_aдреса cетевого компа.
Лет пять назад была у меня такая задачка.Написал функцию и забыл. Если не считать использование WIN API в Кларе наворотами то попробуй прикрутить этот код. Вроде все прицепил.
MODULE('C Library')
memcpy(LONG,LONG,LONG),NAME('_memcpy'),RAW
END
MODULE('iphlpapi')
GetAdaptersInfo(ulong,ulong),LONG,PASCAL,RAW,NAME('GetAdaptersInfo')
END
MODULE('')
GetMacAddress FUNCTION(),string
END
GetMacAddress PROCEDURE ! Declare Procedure
ERROR_SUCCESS EQUATE(0)
ERROR_NOT_SUPPORTED EQUATE(50)
ERROR_INVALID_PARAMETER EQUATE(87)
ERROR_BUFFER_OVERFLOW EQUATE(111)
ERROR_NO_DATA EQUATE(232)
TMP STRING(16)
PIPADDRESS &STRING
TMP1 &STRING
SizeBuff LONG(0)
CODE
pIPAddress &= NEW(STRING(600))
LOOP
M#= GetAdaptersInfo(Address(PIPAddress),Address(SizeBuff))
CASE M#
OF ERROR_SUCCESS
TMP1 &= NEW(STRING(SizeBuff))
MEMCPY(ADDRESS(TMP1),ADDRESS(PIPADDRESS),SizeBuff)
K#=404
TMP = MyByteToHex(VAL(SUB(TMP1,k#+1,1))) &|
MyByteToHex(VAL(SUB(TMP1,k#+2,1))) &|
MyByteToHex(VAL(SUB(TMP1,k#+3,1))) &|
MyByteToHex(VAL(SUB(TMP1,K#+4,1))) &|
MyByteToHex(VAL(SUB(TMP1,k#+5,1))) &|
MyByteToHex(VAL(SUB(TMP1,K#+6,1)))
BREAK
OF ERROR_BUFFER_OVERFLOW
DISPOSE(PIPADDRESS)
PIPADDRESS &= NEW(STRING(SizeBuff))
CYCLE
OF ERROR_NO_DATA
BREAK
! RETURN('')
OF ERROR_NOT_SUPPORTED
BREAK
! RETURN('')
OF ERROR_INVALID_PARAMETER
BREAK
! RETURN('')
END
END
IF ~PIPADDRESS &= NULL
DISPOSE(PIPADDRESS)
END
IF ~TMP1 &= NULL
DISPOSE(TMP1)
END
RETURN(TMP)
MyByteToHex PROCEDURE (ByteToConvert) ! Declare Procedure
ReturnString STRING(2)
CODE
ReturnString = '00'
EXECUTE ByteToConvert/16
ReturnString[1] = '1'
ReturnString[1] = '2'
ReturnString[1] = '3'
ReturnString[1] = '4'
ReturnString[1] = '5'
ReturnString[1] = '6'
ReturnString[1] = '7'
ReturnString[1] = '8'
ReturnString[1] = '9'
ReturnString[1] = 'A'
ReturnString[1] = 'B'
ReturnString[1] = 'C'
ReturnString[1] = 'D'
ReturnString[1] = 'E'
ReturnString[1] = 'F'
END
EXECUTE ByteToConvert % 16
ReturnString[2] = '1'
ReturnString[2] = '2'
ReturnString[2] = '3'
ReturnString[2] = '4'
ReturnString[2] = '5'
ReturnString[2] = '6'
ReturnString[2] = '7'
ReturnString[2] = '8'
ReturnString[2] = '9'
ReturnString[2] = 'A'
ReturnString[2] = 'B'
ReturnString[2] = 'C'
ReturnString[2] = 'D'
ReturnString[2] = 'E'
ReturnString[2] = 'F'
END
RETURN(ReturnString)
MODULE('C Library')
memcpy(LONG,LONG,LONG),NAME('_memcpy'),RAW
END
MODULE('iphlpapi')
GetAdaptersInfo(ulong,ulong),LONG,PASCAL,RAW,NAME('GetAdaptersInfo')
END
MODULE('')
GetMacAddress FUNCTION(),string
END
GetMacAddress PROCEDURE ! Declare Procedure
ERROR_SUCCESS EQUATE(0)
ERROR_NOT_SUPPORTED EQUATE(50)
ERROR_INVALID_PARAMETER EQUATE(87)
ERROR_BUFFER_OVERFLOW EQUATE(111)
ERROR_NO_DATA EQUATE(232)
TMP STRING(16)
PIPADDRESS &STRING
TMP1 &STRING
SizeBuff LONG(0)
CODE
pIPAddress &= NEW(STRING(600))
LOOP
M#= GetAdaptersInfo(Address(PIPAddress),Address(SizeBuff))
CASE M#
OF ERROR_SUCCESS
TMP1 &= NEW(STRING(SizeBuff))
MEMCPY(ADDRESS(TMP1),ADDRESS(PIPADDRESS),SizeBuff)
K#=404
TMP = MyByteToHex(VAL(SUB(TMP1,k#+1,1))) &|
MyByteToHex(VAL(SUB(TMP1,k#+2,1))) &|
MyByteToHex(VAL(SUB(TMP1,k#+3,1))) &|
MyByteToHex(VAL(SUB(TMP1,K#+4,1))) &|
MyByteToHex(VAL(SUB(TMP1,k#+5,1))) &|
MyByteToHex(VAL(SUB(TMP1,K#+6,1)))
BREAK
OF ERROR_BUFFER_OVERFLOW
DISPOSE(PIPADDRESS)
PIPADDRESS &= NEW(STRING(SizeBuff))
CYCLE
OF ERROR_NO_DATA
BREAK
! RETURN('')
OF ERROR_NOT_SUPPORTED
BREAK
! RETURN('')
OF ERROR_INVALID_PARAMETER
BREAK
! RETURN('')
END
END
IF ~PIPADDRESS &= NULL
DISPOSE(PIPADDRESS)
END
IF ~TMP1 &= NULL
DISPOSE(TMP1)
END
RETURN(TMP)
MyByteToHex PROCEDURE (ByteToConvert) ! Declare Procedure
ReturnString STRING(2)
CODE
ReturnString = '00'
EXECUTE ByteToConvert/16
ReturnString[1] = '1'
ReturnString[1] = '2'
ReturnString[1] = '3'
ReturnString[1] = '4'
ReturnString[1] = '5'
ReturnString[1] = '6'
ReturnString[1] = '7'
ReturnString[1] = '8'
ReturnString[1] = '9'
ReturnString[1] = 'A'
ReturnString[1] = 'B'
ReturnString[1] = 'C'
ReturnString[1] = 'D'
ReturnString[1] = 'E'
ReturnString[1] = 'F'
END
EXECUTE ByteToConvert % 16
ReturnString[2] = '1'
ReturnString[2] = '2'
ReturnString[2] = '3'
ReturnString[2] = '4'
ReturnString[2] = '5'
ReturnString[2] = '6'
ReturnString[2] = '7'
ReturnString[2] = '8'
ReturnString[2] = '9'
ReturnString[2] = 'A'
ReturnString[2] = 'B'
ReturnString[2] = 'C'
ReturnString[2] = 'D'
ReturnString[2] = 'E'
ReturnString[2] = 'F'
END
RETURN(ReturnString)