powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Обращение к fll
5 сообщений из 5, страница 1 из 1
Обращение к fll
    #33229367
Фотография FoxLamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простите за ламерский вопрос...
Подскажите, пожалуйста, как поместить свою функцию на С в fll библиотеку и технологию ее вызова
...
Рейтинг: 0 / 0
Обращение к fll
    #33229384
Flex0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fox7help/html/dgtskCreatingBasicFLLLibrary.asp
...
Рейтинг: 0 / 0
Обращение к fll
    #33229407
Фотография FoxLamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Flex0
Спасибо за ссылку. Буду разбираться. А небольшого примерчика нет?
...
Рейтинг: 0 / 0
Обращение к fll
    #33229519
Flex0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А там куча примеров, ну вот допустим:
Перечисление портов в системе:
Без параметров:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
#include <Pro_ext.h>
#include <windows.h>
#include <TCHAR.H > 

#define p(i) parm->p[(i)].val   // описание этой структуры в MSDN, по ссылке.

void EnumSerialPort(ParamBlk FAR *parm)
{
USES_CONVERSION;
OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
BOOL bGetVer = GetVersionEx(&osvi);
char *czNamesPort= (char*)malloc( 1024 );
char *czConvNamesPort = (char*)malloc( 10 );
int lenStr= 0 ;
ZeroMemory(czNamesPort, 1024 );
ZeroMemory(czConvNamesPort, 10 );
 if(bGetVer && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT))
	 {
		 TCHAR szDevices[ 65535 ];
         DWORD dwChars = QueryDosDevice(NULL, szDevices,  65535 );
         if(dwChars)
          {
		   int i= 0 ;
		    for (;;)
			{
			TCHAR* pszCurrentDevice = &szDevices;
			 int nLen = _tcslen(pszCurrentDevice);

			 if(nLen >  3  && _tcsnicmp(pszCurrentDevice, _T("COM"),  3 ) ==  0 )
                      {
					   lenStr = lenStr+nLen;
						strncat(czNamesPort,pszCurrentDevice,nLen);
						strcat(czNamesPort,"\n");
                       }
				    while(szDevices[i] != _T('\0'))  i++;
                    i++;
                   if(szDevices[i] == _T('\0'))  break;
			}
		  } 
	  }
	 _RetChar(czNamesPort);
}

FoxInfo myFoxInfo[] = {
	{"ESP"         ,(FPFI) EnumSerialPort,       0 ,""          },
};
extern "C"  FoxTable _FoxTable = {(FoxTable  *)  0 , sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo};

Создаешь проект в соответствиями правилами описанными в MSDN, тоесть :
Категория: Code Generation:
опция Use Rut-time library установить в Multithreaded DLL
опция Calling Convertion установить в _fastcall
И так далее по ссылке которую я тебе дал.

Допустим твой проект P1.fll (кстати расширение не важно)
Вызов из фокса:
Код: plaintext
1.
Set LIBR TO P1.fll additi
? ESP()
===========================================================
С параметрами:
Создадим таймер:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
#include <Pro_ext.h>
#include <windows.h>
#include <TCHAR.H > 
// И так далее, в зависимости от того где определена  функция.
( у каждой API и С -  функции в MSDN всегда есть описание где она определна)

#define p(i) parm->p[(i)].val

void CSetTimer(ParamBlk FAR *parm)
{
HWND hWnd     = (HWND) p( 0 ).ev_long;
UINT nIDEvent  = (UINT)  p( 1 ).ev_long;
UINT uElapse    = (UINT)  p( 2 ).ev_long;
UINT Rez= 0 ;
Rez = SetTimer(hWnd,nIDEvent,uElapse,(TIMERPROC)TimerProc);
_RetInt(Rez, 10 );
}

Убьем таймер:
void CKillTimer(ParamBlk FAR *parm)
{
HWND hWnd     = (HWND)p( 0 ).ev_long;
UINT nIDEvent = (UINT)p( 1 ).ev_long;
UINT Rez= 0 ;
Rez = KillTimer(hWnd,nIDEvent);
_RetInt(Rez, 10 );
}

FoxInfo myFoxInfo[] = {
	{"CSetTimer"      ,(FPFI)  CSetTimer,         3 , "III"       }, 	{"CKillTimer"       ,(FPFI)  CKillTimer,           2 , "II"       },
};

extern "C"  FoxTable _FoxTable = {(FoxTable  *)  0 , sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo};

Использование из VFP

Код: plaintext
1.
2.
3.
4.
5.
6.
Set LIBR TO P1.fll additi
Local ID_Events, nMillisec ,ID_Timer
ID_Events  = Rand() && В принципе любое число, что душе угодно.
nMillisec =  1000 
ID_Timer = СSetTimer(ID_Events,nMillisec) && Установили таймер
? СKillTimer(ID_Timer)                             && Убили таймер
 

[i]Это для синтаксиса C++. Для С чуток не так.
...
Рейтинг: 0 / 0
Обращение к fll
    #33229998
Фотография FoxLamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз большое спасибо
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Обращение к fll
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]