On-line: Andrey, Dr. Oldwarez, гостей 0. Всего: 2 [подробнее..]
АвторСообщение
постоянный участник


Пост N: 1
Зарегистрирован: 25.12.07
ссылка на сообщение  Отправлено: 25.12.07 17:41. Заголовок: C чего начать? Есть ли С-API? И т. д.


Здравствуйте.

Хотелось бы услышать советы и рекомендации, во-первых, "откуда качать, что ставить и т.п.". И второе, это информация по С-API.

Объясню свою ситуацию. Я не клипперист (дельфист), однако, получилось, что плотно познакомился с Clipper и Alaska Xbase++. Для Alaska Xbase написал дельфи-оболочку над С-API и полностью портировал FastReport (генератор отчетов) для этого языка, продукт продается и т.д (см. http://www.hotsoft.ru/ALASKA/frax_eng.htm).

Но вот стал получать много писем из Испании Призывают тоже самое сделать для Harbour/xHarbour/FiveWin и т. д..

Так как ничего до этого про Harbour не знал (слышал краем уха только), то хочется и услышать советы по поводу "с чего начать, на что обратить внимание", да и вообще советы по поводу "а стоит ли заморачиваться, есть ли здесь рынок и т.д."

Спасибо.

Спирин Сергей.


Спасибо: 0 
Профиль
Ответов - 201 , стр: 1 2 3 4 5 6 7 8 9 10 11 All [только новые]


Администратор




Пост N: 679
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.12.07 14:49. Заголовок: dbSkip() может наход..


dbSkip() может находится как в основной exe, так и в harbour.dll. Из основного exe-модуля харбор-программы dbSkip() вызвать имхо невозможно, из harbour.dll - без проблем, если при создании frsyst.dll линковать ее вместе с Harbour.dll
Поскольку для Харбора допустимы оба режима: как с dll, так и без, а большинство пользователей с dll не заморачиваются, будем считать, что напрямую из frsyst вызвать dbSkip нельзя
Значит, надо dbSkip() вызывать из интерфейсной lib, которая будет прилинковываться к харбор-программе независимо от ее режима, и взаимодействовать с frsyst.dll


Спасибо: 0 
Профиль
постоянный участник


Пост N: 332
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 26.12.07 15:01. Заголовок: C-API Harbour hbvm.h..


C-API [x]Harbour hbvm.h

extern HB_EXPORT void hb_vmDo( USHORT uiParams ); /* invoke the virtual machine */
extern HB_EXPORT void hb_vmFunction( USHORT uiParams ); /* executes a function */
extern HB_EXPORT void hb_vmSend( USHORT uiParams ); /* sends a message to an object */
extern HB_EXPORT PHB_ITEM hb_vmEvalBlock( PHB_ITEM pBlockItem ); /* executes passed codeblock with no arguments */
/* executes passed codeblock with variable number of arguments */
extern HB_EXPORT PHB_ITEM hb_vmEvalBlockV( PHB_ITEM pBlockItem, ULONG ulArgCount, ... );
extern HB_EXPORT PHB_ITEM hb_vmEvalBlockOrMacro( PHB_ITEM pItem ); /* executes codeblock or macro pointed by given item */
extern HB_EXPORT void hb_vmDestroyBlockOrMacro( PHB_ITEM pItem ); /* destroy codeblock or macro in given item */

Маленький пример, в [x]Harbour (prg level) определена функция _ONTIMEREVENTS

VOID CALLBACK TTimerProc( HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
if ( ! pSymbolEvents )
pSymbolEvents = hb_dynsymSymbol( hb_dynsymGet( "_ONTIMEREVENTS" ) ); // есть такая функция или нет

if ( pSymbolEvents ) // если есть
{
hb_vmPushSymbol( pSymbolEvents ); //перед выполнением помещаем p-code функции в стек
hb_vmPushNil(); // обязательно
hb_vmPushLong( ( LONG ) hWnd ); //передаем первый параметр числовой в данном случае
hb_vmPushLong( uMsg ); // передаем второй параметр
hb_vmPushLong( idEvent ); // передаем третий
hb_vmPushLong( dwTime ); // передаем 4- параметр
hb_vmDo( 4 ); // виртуальная машина [x]Harbour выполняет код помещенный в стек - что значит 4 обьяснять смысла нет

к результату выполнения можно достучаться
hb_param( -1, HB_IT_LONG)
или проще
hb_parnl( -1 )

}
}


Спасибо: 0 
Профиль
Администратор




Пост N: 680
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.12.07 15:02. Заголовок: Кстати, к слову Мне ..


Кстати, к слову
Мне кажется, что сейчас пользователей у Харбора куда больше, чем у Alaska xBase

Спасибо: 0 
Профиль
постоянный участник


Пост N: 333
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 26.12.07 15:06. Заголовок: Pasha пишет: Из осн..


Pasha пишет:

 цитата:
Из основного exe-модуля харбор-программы dbSkip() вызвать имхо невозможно


Довольно спорное утверждение



Спасибо: 0 
Профиль
постоянный участник


Пост N: 10
Зарегистрирован: 25.12.07
ссылка на сообщение  Отправлено: 26.12.07 15:07. Заголовок: Pasha пишет: Из осн..


Pasha пишет:

 цитата:
Из основного exe-модуля харбор-программы dbSkip() вызвать имхо невозможно



Здесь не факт, хотя нюансы могут быть. Почему не передать указатель на dbSkip(), а в dll присвоить прототипу... Но действительно, больше интересно:


 цитата:
Значит, надо dbSkip() вызывать из интерфейсной lib, которая будет прилинковываться к харбор-программе независимо от ее режима, и взаимодействовать с frsyst.dll



Отсюда вопрос: Как будет выглядеть функция на С, вызывающая любую харбур-функцию. Типа:

CallAnyHarbourFunc(cFuncName, xListOfParametrs) возврат xValue ?





Спасибо: 0 
Профиль
постоянный участник


Пост N: 334
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 26.12.07 15:13. Заголовок: Pasha пишет: Мне ка..


Pasha пишет:

 цитата:
Мне кажется, что сейчас пользователей у Харбора куда больше, чем у Alaska xBase



Мне тоже, но часть этих пользователей пользуется не коммерческими, а GPL разработками и заставить их что-то купить - это значит оскорбить их религиозные чувства


Спасибо: 0 
Профиль
постоянный участник


Пост N: 11
Зарегистрирован: 25.12.07
ссылка на сообщение  Отправлено: 26.12.07 15:19. Заголовок: Петр пишет: Мне тож..


Петр пишет:

 цитата:
Мне тоже, но часть этих пользователей пользуется не коммерческими, а GPL разработками и заставить их что-то купить - это значит оскорбить их религиозные чувства



В переписке с испанцами, я переспрашивал их. Говорят купим

Но честно говоря, я колебался (и сейчас колеблюсь) именно из-за этого...

Спасибо: 0 
Профиль
Администратор




Пост N: 681
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.12.07 15:20. Заголовок: Чтобы напрямую испол..


Чтобы напрямую использовать из frsyst harbour vm, надо ее по крайней мере прилинковать
А это значит, что vm будет содержаться и в основном exe, и в frsyst.dll, что не есть хорошо, а наоборот, очень плохо.

А пример вызова харбор-функции Петр дал. Педед вызовом в стек харбора надо затолкать параметры функции. Но может быть стоит вызывать не харбор-функцию, а ее аналог на C, к примеру, средства rdd

Что касается dbSkip, это может выглядеть так:

#include "hbapi.h"
#include "hbapirdd.h"

...
AREAP pArea = ( AREAP ) hb_rddGetCurrentWorkAreaPointer();
long lRecToSkip = ...;
if( pArea )
SELF_SKIP( pArea, lRecToSkip );



Спасибо: 0 
Профиль
Администратор




Пост N: 682
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.12.07 15:23. Заголовок: Петр пишет: Pasha п..


Петр пишет:

 цитата:
Pasha пишет:

цитата:
Из основного exe-модуля харбор-программы dbSkip() вызвать имхо невозможно



Довольно спорное утверждение



Я имел в виду вызов из внешней dll (frsyst) функции, находящейся в основном exe-модуле программы
Как это сделать, я не представляю

Спасибо: 0 
Профиль
постоянный участник


Пост N: 12
Зарегистрирован: 25.12.07
ссылка на сообщение  Отправлено: 26.12.07 16:03. Заголовок: Pasha пишет: Я имел..


Pasha пишет:

 цитата:
Я имел в виду вызов из внешней dll (frsyst) функции, находящейся в основном exe-модуле программы
Как это сделать, я не представляю



Чисто теоретически это просто. Я не буду "мучится" и писать пример на С (я все-таки дельфист ). Поэтому пример на Паскале, он язык читабельный:

EXE:

type
TCallBack = procedure (P: Pointer); stdcall;

procedure MMsg(P: PChar);
begin
ShowMessage(StrPas(P));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
CallBack: TCallBack;
H: THandle;
begin
H := LoadLibrary('Project2.dll');
@CallBack := GetProcAddress(H, 'CallBack');
CallBack(@MMsg); <----------------------------передаем адрес процедуры MMsg
FreeLibrary(H);
end;

-------------------------
DLL:

type
TMsgProc = procedure (P: PChar);

procedure CallBack(P: Pointer); stdcall; export;
var
MsgProc: TMsgProc;
begin
@MsgProc := P; <-------------------------------------------- присваиваем адрес
MsgProc(PChar('Это dll вызвала процедуру в exe !!!!')); <-------- и вызываем
end;

exports
CallBack name 'CallBack';

--------------------------------------------------------------------

Ну вот, только что проверил в Delphi, все OK. Оттого, что EXE будет С-ишное, это ничего не поменяет.

То есть, в MMsg можно по моей задумке поместить:

CallAnyHarbourFunc(cFuncName, xListOfParametrs) -> xValue ...

Понятно, что не все так просто, параметры и т. д. , но если прототип заработает, то это уже.. неплохо будет....

Спирин Сергей.




Спасибо: 0 
Профиль
постоянный участник


Пост N: 13
Зарегистрирован: 25.12.07
ссылка на сообщение  Отправлено: 26.12.07 16:40. Заголовок: Меня все-таки интере..


Меня все-таки интересуют возможные подходы реализации функции:

CallAnyHarbourFunc(cFuncName, xListOfParametrs) -> xValue ...

Возможно, реализация этой функции может быть чисто на Харбуре, плюс какая-то С-оболочка к ней , адрес этой оболочки и будет передаваться в Fast?

Хотя, в Аляске есть просто С-API функция - _conCallPa(). Может что-то подобное есть и Харбуре?

Спирин Сергей.

Спасибо: 0 
Профиль
постоянный участник


Пост N: 335
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 26.12.07 16:44. Заголовок: Чем не устраивает то..


Чем не устраивает то, что я написал?

Спасибо: 0 
Профиль
Администратор




Пост N: 683
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.12.07 16:45. Заголовок: Такой способ по-види..


Такой способ по-видимому будет работать
В этом случае я советую обратить внимание на то, что из-за трансляции средствами препроцессора (#define) настоящее имя функции может быть другим
Надо внимательно смотреть на описание каждой функции в *.h

Спасибо: 0 
Профиль
постоянный участник


Пост N: 336
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 26.12.07 16:53. Заголовок: Sergey Spirin пишет:..


Sergey Spirin пишет:

 цитата:
Поэтому пример на Паскале, он язык читабельный:



Да?

Посмотри здесь http://clipper.fastbb.ru/?1-1-0-00000105-000-0-0-1191730075

Это то?

Спасибо: 0 
Профиль
постоянный участник


Пост N: 14
Зарегистрирован: 25.12.07
ссылка на сообщение  Отправлено: 26.12.07 17:10. Заголовок: Петр пишет: Чем не ..


Петр пишет:

 цитата:
Чем не устраивает то, что я написал?



Почему не устраивает? Спасибо. Кстати, если можно еще раз "выжимку" про VM. Почему это плохо использовать (по словам Pasha)? И, это будет работать только с harbour.dll? Или в "монолитном" exe тоже?

Простите, я действительно пока здесь новичек.

Спирин Сергей.

Спасибо: 0 
Профиль
постоянный участник


Пост N: 15
Зарегистрирован: 25.12.07
ссылка на сообщение  Отправлено: 26.12.07 17:17. Заголовок: Петр пишет: Поэтому..


Петр пишет:

 цитата:
Поэтому пример на Паскале, он язык читабельный:

Да?

Посмотри здесь http://clipper.fastbb.ru/?1-1-0-00000105-000-0-0-1191730075

Это то?



Честно говоря, тоже не понял Вашу ссылку, мне для примера на Паскале быстрее набросать просто, да и проверить...

Но все-равно, спасибо, увидел, что в Харбуре загружать dll намного удобнее чем в той же Аляске


Спасибо: 0 
Профиль
Администратор




Пост N: 684
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.12.07 17:21. Заголовок: Sergey Spirin пишет:..


Sergey Spirin пишет:

 цитата:
Кстати, если можно еще раз "выжимку" про VM. Почему это плохо использовать (по словам Pasha)? И, это будет работать только с harbour.dll? Или в "монолитном" exe тоже?



Плохо иметь две vm. В этом случает одна из них работать не будет
А если vm будет содержаться в харбор-программе (exe), и будет механизм вызова функций vm из сторонней dll, то ничего в этом плохого нет

Спасибо: 0 
Профиль
постоянный участник


Пост N: 16
Зарегистрирован: 25.12.07
ссылка на сообщение  Отправлено: 26.12.07 17:31. Заголовок: Pasha пишет: А если..


Pasha пишет:

 цитата:
А если vm будет содержаться в харбор-программе (exe), и будет механизм вызова функций vm из сторонней dll, то ничего в этом плохого нет



OK. Тогда это действительно хороший вариант.

В семействе hb_vmXXX - функций, наверное, есть и для работы с переменными, массивами, объектами? Если так, то пожалуй, это то что мне надо

Спасибо: 0 
Профиль
постоянный участник


Пост N: 337
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 26.12.07 17:43. Заголовок: Sergey Spirin пишет:..


Sergey Spirin пишет:

 цитата:
Почему это плохо использовать (по словам Pasha)? И, это будет работать только с harbour.dll? Или в "монолитном" exe тоже?



Пример который я привел корректно работает в "монолитном" exe.

Я не знаю, что имел ввиду Pasha, собственно он использует для работы xHarbour,- я Harbour.
Могу лишь добавить, что по планам разработчиков Harbour, функции можно будет вызывать и использовать не только из dll, но и из другого exe файла, также можно будет использовать библиотеки hrb, но это будет в Harbour 2.0.

Я Pascal не очень, понял лишь, что это вызов функции из dll,
и подумал, что Вам будет интересно узнать об использовании dll в Harbour (в xHarbour функции немного иначе называются), .



Спасибо: 0 
Профиль
постоянный участник


Пост N: 338
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 26.12.07 17:55. Заголовок: Pasha пишет: Плохо ..


Pasha пишет:

 цитата:
Плохо иметь две vm. В этом случает одна из них работать не будет


Это в лучшем случае, скорее всего программа просто вылетит с GPF.

Sergey Spirin пишет:

 цитата:
В семействе hb_vmXXX - функций, наверное, есть и для работы с переменными, массивами, объектами? Если так, то пожалуй, это то что мне надо



Это все конечно есть но не только в hb_vm, а и в hb_item*, что которые собственно и являются аналогами _con* в Alaska.




Спасибо: 0 
Профиль
Ответов - 201 , стр: 1 2 3 4 5 6 7 8 9 10 11 All [только новые]
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 119
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет