Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Обращение к fll / 5 сообщений из 5, страница 1 из 1
23.08.2005, 10:43:35
    #33229367
FoxLamer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к fll
Простите за ламерский вопрос...
Подскажите, пожалуйста, как поместить свою функцию на С в fll библиотеку и технологию ее вызова
...
Рейтинг: 0 / 0
23.08.2005, 10:48:50
    #33229384
Flex0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к fll
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fox7help/html/dgtskCreatingBasicFLLLibrary.asp
...
Рейтинг: 0 / 0
23.08.2005, 10:57:25
    #33229407
FoxLamer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к fll
2Flex0
Спасибо за ссылку. Буду разбираться. А небольшого примерчика нет?
...
Рейтинг: 0 / 0
23.08.2005, 11:36:41
    #33229519
Flex0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к fll
А там куча примеров, ну вот допустим:
Перечисление портов в системе:
Без параметров:
Код: 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
23.08.2005, 14:01:36
    #33229998
FoxLamer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обращение к fll
Еще раз большое спасибо
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Обращение к fll / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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