CyberForum.ru - Форум программистов и сисадминов
Вернуться   Форум программистов и сисадминов CyberForum.ru > Форум программистов > Форум C++ > Форум C++ Builder

Закрытая тема Создать новую тему
 
Старый 27.11.2009, 21:38   #1
Otaka
Форумчанин
 
Аватар для Otaka
 
Регистрация: 11.12.2008
Адрес: Украина. Днепропетровск
Сообщений: 1,011
Репутация: 1551 (460)
Лампочка Как подключить и использовать LUA-скрипты в своих приложениях написанных на C++Builder(6)

По просьбе KTYJIX пишу небольшую инструкцию, как подключить и использовать этот замечательный язык Lua в своих приложениях написанных на C++Builder(6). Надеюсь, кому-нибудь пригодится.
Небольшое вступление: Когда-то я искал для себя какую-нибудь библиотеку которая могла бы выполнять скрипты в приложении. Мне хотелось, чтобы пользователь мог извне(скриптом) управлять внутренним состоянием приложения. Я нашел такую интересную штуку, как VBScript ActiveX. Если все сделать как следует, то у нас получится типа как VBA в Word. Статейку как проинициализировать VBScript в своем приложении любой желающий может прочесть тут: http://www.rsdn.ru/article/com/wscript/vstr_WS.xml. Какое-то время я пытался пользоваться этим бейсиком, но как-то оно у меня не очень хорошо работало, и поэтому я продолжал поиски.
Как-то я установил себе игру Сталкер. Я в нее играл, играл, потом начал копаться в игровых файлах, и увидел, что скрипты написаны на Lua. Начав гуглить я обнаружил, что в нете есть полно статей о том, как программировать на этом языке.
Искать место где можно скачать луа долго не прийдется. Официальный сайт находится вот тут: http://www.lua.org. На этом сайте можно скачать исходники, скомпилированные библиотеки, почитать документацию. С этого сайта нас перенаправляют вот сюда: http://luabinaries.luaforge.net/download.html, где и лежат сами архивы с файлами.
Для начала зайдите на http://luabinaries.luaforge.net/download.html и скачайте lua5_1_4_Win32_dll8_lib.zip(вы можете скачать архив в аттаче, там все уже готово для использования в билдере). Конечно, если хотите смотреть в исходники, качайте их себе на здоровье. Компилируются они очень хорошо на VS2008(лично пробовал).

Так вот, после того, как вы скачали себе архив зайдите в него, и сделайте следующее:
1. lua5.1.dll lua51.dll в Windows/system32(Вы конечно же можете копировать эти библиотеки в каждый новый проект, но мне лень).
2. Создайте папочку lua в <CBuilder>/lib, и скопируйте в неё lib файлы из архива. Так как файлы lib от Visual Studio не совсем совместимы с билдеровскими, нужно преобразовать их с помощью утилиты COFF2OMF которую можно найти в bin папке Билдера(В приаттаченом архиве эти библиотеки уже сконвертированы).
3. Создайте папку lua в <CBuilder>/include и забросьте в неё файлы из include папки архива.
Теперь можно начинать делать простейшую программу с применением Луа.
Создайте новый проект, и с помощью «Project/Add to Project» добавьте в него из папки lib/lua файлы lua5.1.lib и lua51.lib.
Теперь, когда проект подготовлен к написанию кода, нужно задуматься о том, что Луа – это Сишная библиотека, поэтому ни какими классами там и не пахнет. В Интернете вы можете найти С++ врапперы типа luabind, но мне, например, вся их функциональность не нужна, поэтому воспользуемся примитивнейшим враппером. Вот его код:

Код C++
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
class TLua
{
lua_State*lua;
bool isowner;
public:
TLua()
     {
     lua=luaL_newstate();
     isowner=true;
     if(lua==NULL)
          {
          lua=NULL;
          throw Exception("Lua was not initialized");
          }
     LoadAllStdLibs();
     }
TLua(lua_State*lua_state)
     {
     lua=lua_state;
     isowner=false;
     }
 
~TLua()
     {
     if(isowner==true)
          {
          if(lua!=NULL)
               {
               lua_close(lua);
               }
          }
     }
__inline void LoadAllStdLibs()
     {
     luaL_openlibs(lua);
     }
__inline void DoStr(char*str)
     {
     int res=luaL_dostring(lua, str);
     if(res!=0)throw Exception(lua_tostring(lua,-1));
     }
 
__inline void DoFile(char*str)
     {
     int res=luaL_dofile(lua, str);
     if(res!=0)throw Exception(lua_tostring(lua,-1));
     }
__inline int RegFunction(char*name,int(*poin)(lua_State*st))
     {
     lua_register(lua,name,poin);
     return 0;
     }
__inline void GlobalField(char*field)
     {
     lua_getfield(lua,LUA_GLOBALSINDEX,field);
     }
__inline int ToInteger(int index)
     {
     return lua_tointeger(lua,index);
     }
__inline double ToNumber(int index)
     {
     return lua_tonumber(lua,index);
     }
__inline const char*ToString(int index)
     {
     return lua_tostring(lua,index);
     }
__inline void Push(int i)
     {
     lua_pushinteger(lua,i);
     }
__inline void Push(char*str)
     {
     lua_pushstring(lua,str);
     }
__inline void PushNil()
     {
     lua_pushnil(lua);
     }
__inline void PushNumber(double d)
     {
     lua_pushnumber(lua,d);
     }
__inline void  Pop(int count)
     {
     lua_pop(lua,count);
     }
__inline int GetTop()
     {
     return lua_gettop(lua);
     }
__inline void SetTop(int top)
     {
     lua_settop(lua,top);
     }
__inline int GetType(int index)
     {
     return lua_type(lua,index);
     }
__inline const char*GetTypeName(int TypeCode)
     {
     return lua_typename(lua,TypeCode);
     }
void Error()
     {
     lua_error(lua);
     }
};
Этот враппер содержит в себе только самые основные функции, которыми я пользовался. Остальные мне были не нужны, поэтому их тут и нет. Но пока это не важно.
Напишем простое приложенице, которое будет выводить Hello World в Label на форме.
Добавьте с помощью include файл lua.hpp в ваш проект.
Теперь создаем глобальную переменную
Код C++
1
TLua lua;
В конструкторе класса TLua создается новый контекст для виртуальной машины (не знаю, можно ли так это назвать) и вызывается инициализация встроенных в Луа функций.
Теперь нужно создать функцию, которую можно будет вызвать из Луа.
Функции должны иметь такой вот формат:
int Имя_функции(lua_State*st)
Cоздаем функцию int Lua_Message(lua_State*st).

Код C++
1
2
3
4
5
6
7
8
9
10
int Lua_Message(lua_State*st)
{
TLua lua(st);
int top=lua.GetTop();//Передали ли нам параметры?
if(top>0)
        {
        Form1->Label1->Caption=lua.ToString(top);
        }
return 0;
}
Так как в приложении может быть несколько виртуальных машин, в функцию передается указатель на весь контекст данной виртуальной машины.
В Луа все параметры передаются через стек, но только не через стандартный стек приложения, а через собственный, луовский. Луа не ведет контроля за количеством параметров которое было передано функции, аргументы просто пихаются в стек, сколько бы их не было(но стек не безразмерен, есть ограничение). Нужно помнить, что аргументы помещаются в стек слева направо, то есть самый левый аргумент будет в самом низу стека.
В этой функции мы берем Луовский контекст, смотрим количество параметров(GetTop, правда, не учтет вложенность функций) переданных ей. Если параметров больше одного, то функция ToString снимет значение по заданному индексу.
!!!В Луа переменные не параметризованы, поэтому в одну и ту же переменную можно помещать и строки и целые числа и дробные числа, конвертирование происходит автоматически.
Возвращаемое значение, вроде бы, как говорит о том, сколько переменных возвращает наша функция. Так как в данном примере возвращаемого значения нет, то и return 0.
После этого нужно зарегистрировать эту функцию в Луа контексте. В событии FormCreate запишем следующее:

Код C++
1
2
3
4
void __fastcall TForm1::FormCreate(TObject *Sender)
{
lua.RegFunction("Message",Lua_Message);
}
"Message" – имя, под которым Луа будет знать нашу функцию.
Теперь нужно на форму кинуть один Memo и кнопку. В Memo впишите строки

str1="Hello"
str2="world"
str3="!"
Message(str1.." "..str2..str3)
По событию ButtonClick остается только натравить Луа на текст из Memo

Код C++
1
2
3
4
void __fastcall TForm1::Button1Click(TObject *Sender)
{
lua.DoStr(Memo1->Text.c_str());
}
Теперь, запустив приложение, вы получите сообщение с приветствием.
Заметьте, в Луа конкатенация строк не +, а две точки (..)
Как видите, вызывать из Луа функции и передавать нашей программе параметры проще простого. Теперь рассмотрим, как же Луа может узнать о состоянии нашей программы. В принципе, так как можно регистрировать функции, можно регистрировать в Луа и переменные. Одно ограничение – переменные регистрируются только для чтения, поэтому их значение нельзя изменять непосредственно, а только через вызов функций. В моем же случае скрипт будет получать информацию из хостового приложения через те же функции.
Пример: Дописываем новую функцию, которая возвращает скрипту строку с приветствием на случайном языке:
Код C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int Lua_GetGreeting(lua_State*st)
{
TLua lua(st);
char*greetings[]=
        {
         "Привет, Мир",
        "Hello World",
        "Konnichi wa, Sekai",
        "Hello Botё",
        "Прывітаньне, Свет",
        "Привіт, Cвіт",
        "Здравей, Свят",
        "Ola Mundo",
        "Hallo wereld",
        "Dia duit domhan"        };
lua.Push(greetings[random(10)]);
return 1;
}
Все очень просто. Мы просто помещаем значение в стек функцией Push, и с помощью return 1 сообщаем, что был возвращен один параметр.
Теперь в FormCreate нужно не забыть зарегистрировать эту новую функцию:
Код C++
1
2
3
4
5
6
void __fastcall TForm1::FormCreate(TObject *Sender)
{
randomize();
lua.RegFunction("Message",Lua_Message);
lua.RegFunction("GetGreeting",Lua_GetGreeting);
}
Написав в Memo следующий скриптик мы получим приветствие на каком-то случайном языке:

g=GetGreeting()
Message(g)
Теперь каждый сможет добавить в свое приложение средства автоматизации, ведь это так просто.
Исходник: lua5_1_4_Win32_bin.zip


Дополнение: Пример кода для взаимодействия функций Си и функций Lua



Полезные ссылки по данной теме:
Непонятки с LUA (файл не сохраняется)
Вторую неделю пытаюсь подружить Lua и BCB6, и наблюдаю их несовместимость
Остановка скриптов, luabind и потоки
LUA и прекрасный враппер для Билдера
Как передать из кода луа в программу на с++ массив чисел
Не могу найти раздел по lua на этом форуме
Как можно использовать функции написанные на луа
Возможно ли сделать самому качественный экспорт с++ классов, пространств имен и прочего в луа?

Последний раз редактировалось NiTan; 01.02.2012 в 21:17. Причина: Добавил ссылки на вынесенные темы
Otaka вне форума
Другие темы раздела
C++ Builder web-браузер
Вот решил создать простенький web-браузер. За основу взял CppWebBrowser. Если у кого-то есть описание всех свойств и событий, то напишите, пожалуйста. Ещё возник вопрос по поводу того, как сделать, чтоб при нажатии на ссылку эта ссылка открывалась не в IE, а в моей программе. Если кто-то.... web-браузер
C++ Builder TThread и ShowMessage
Пискал ответ на проблему в гугле - вижу, что проблема довольно масштабная, т.к. у многих возникают вопросы. Единственная проблема - почти все решения относятся к Delphi. Из тех немногих, что касались C++Builder, я толком так ничего и не понял и какого-то внятного решения не увидел. Суть проблемы.... TThread и ShowMessage
Старый 27.11.2009, 22:34   #2
KTYJIX
Задающий вопросы (%
 
Аватар для KTYJIX
 
Регистрация: 09.05.2009
Сообщений: 181
Репутация: 14 (13)
По умолчанию Re: Lua+Builder

Думаю тему можно закрепить в шапке раздела.
Отака, как всегда, низкий поклон и гигантское спасибо.
KTYJIX вне форума
Старый 22.02.2010, 23:58   #3
black-eye
Форумчанин
 
Регистрация: 24.09.2009
Адрес: Москва
Сообщений: 114
Репутация: 17 (17)
По умолчанию Re: Lua+Builder

Итак ,KTYJIX, поясняем луа)))

test.h
Код C++
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
 
class TMTH
{
public:
AnsiString name;
AnsiString str;
TTimer *Timer;
void __fastcall TimerTimer(TObject *Sender);
TMTH(AnsiString name_of_memory, AnsiString string_of_code)
{
Timer=new TTimer(Application);
str=string_of_code;
name=name_of_memory;
Timer->Interval=1;
Timer->OnTimer=TimerTimer;
}
void Start()
{
Timer->Enabled=true;
}
void End()
{
Timer->Enabled=false;
}
};
 
void __fastcall TMTH::TimerTimer(TObject *Sender)
{
try
{
Lua.DoStr(str.c_str());
}catch(...) {End(); ShowMessage("Process Stoped!!!");};
} 
 
 
main.cpp
Код C++
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
 
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "lua.h"
 
TLua Lua;
 
#include "myclasses.cpp" //Классы Otakи
#include "test.h" //Класс TMTH
 
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
int hp=100; //Переменная
TTList<TMTH*>*mths=new TTList<TMTH*>();//Так мы создадим возможность запуска большого кол-ва потоков
 
int Lua_ShowMessage(lua_State*st) //Функция, которая выводит сообщения
{
TLua lua(st);
int top=lua.GetTop();
if(top==1) ShowMessage(lua.ToString(top));
return 0;
}
 
int Lua_ReturnHP(lua_State*st) //Функция, которая возвращает значения переменной HP
{
TLua lua(st);
lua.Push(hp);
return 1;
}
 
 
int Lua_SetHP(lua_State*st) //Функция, которая устанавливает значение HP
{
TLua lua(st);
int top=lua.GetTop();
if(top==1) hp=lua.ToInteger(top);
return 0;
}
 
 
int Lua_end_thread(lua_State*st)//Функция, которая завершает поток (пример: end_thread("name")) где "name" индификатор потока, т.е. имя заданное в памяти
{
TLua lua(st);
int top=lua.GetTop();
if(top==1)
{
int t;
AnsiString n=lua.ToString(top);
for(int i=0;i<mths->Count;i++)
{
t=i;
if(mths->Get(t)->name==n)
{
mths->Get(t)->End();
delete mths->Get(t);
mths->Delete(t);
ShowMessage("Thread end :)");// Можно убрать :)
break;
}
}
}
return 0;
}
 
int Lua_thread(lua_State*st)
/*
Функция, которая создаёт поток, пример:
thread("name","script+end_thread(\"name\")"), где "name" - индификатор потока script+end_thread(\"name\") - скрипт, который будет выполняться в потоке "name"
script - сам скрипт
???Почему script+end_thread(\"name\")???
Ответ - потому-что, я не знаю как прикрутить end_thread(\"name\") в поток :(
???Почему мы пишем end_thread(\"name\"), а не end_thread("name")???
Ответ - так надо когда мы задаём текст(в нашем случае скрипт), в память... Иначе бы луа посчитал "name" функцией
*/
{
TLua lua(st);
int top=lua.GetTop();
if(top==2)
{
AnsiString name=lua.ToString(top-1);
AnsiString code=lua.ToString(top);
TMTH *mth=new TMTH(name,code);
int cnt=mths->Count;
mths->Add(mth);
mths->Get(cnt)->Start();
}
return 0;
}
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
//Указываем функции
Lua.RegFunction("ShowMessage",Lua_ShowMessage);
Lua.RegFunction("ReturnHP",Lua_ReturnHP);
Lua.RegFunction("SetHP",Lua_SetHP);
Lua.RegFunction("end_thread",Lua_end_thread);
Lua.RegFunction("thread",Lua_thread);
//Запускаем файл
try
{
Lua.DoFile("test.lua");
}catch(...) {ShowMessage("Process Stoped!!!"); Application->Terminate();};
}
//---------------------------------------------------------------------------
 
black-eye вне форума
Старый 13.07.2010, 20:01   #4
Evg
Форумчанин
Эксперт C++
Автор FAQ
 
Аватар для Evg
 
Регистрация: 30.03.2009
Сообщений: 9,482
Записей в блоге: 19
Репутация: 10980 (3011)
По умолчанию Re: Lua+Builder

А как со всеми этими *.lib и *.dll слинковаться статически (чтобы не таскать эти *.dll)?
Evg на форуме
Старый 16.07.2010, 23:59   #5
MelKiY
Форумчанин
 
Регистрация: 20.09.2009
Сообщений: 101
Репутация: -121 (2)
По умолчанию Re: Lua+Builder

удалено Спасибо!!!! я очень долго искал такую статью YAHOO!
 Комментарий модератора Nitan
Первый и последний мат! Читайте правила форума.


Добавлено через 2 часа 51 минуту
А я хотел бы знать откуда ты взял эти:


Код C++
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
__inline void LoadAllStdLibs()
     {
     luaL_openlibs(lua);
     }
__inline void DoStr(char*str)
     {
     int res=luaL_dostring(lua, str);
     if(res!=0)throw Exception(lua_tostring(lua,-1));
     }
 
__inline void DoFile(char*str)
     {
     int res=luaL_dofile(lua, str);
     if(res!=0)throw Exception(lua_tostring(lua,-1));
     }
__inline int RegFunction(char*name,int(*poin)(lua_State*st))
     {
     lua_register(lua,name,poin);
     return 0;
     }
__inline void GlobalField(char*field)
     {
     lua_getfield(lua,LUA_GLOBALSINDEX,field);
     }
__inline int ToInteger(int index)
     {
     return lua_tointeger(lua,index);
     }
__inline double ToNumber(int index)
     {
     return lua_tonumber(lua,index);
     }
__inline const char*ToString(int index)
     {
     return lua_tostring(lua,index);
     }
__inline void Push(int i)
     {
     lua_pushinteger(lua,i);
     }
__inline void Push(char*str)
     {
     lua_pushstring(lua,str);
     }
__inline void PushNil()
     {
     lua_pushnil(lua);
     }
__inline void PushNumber(double d)
     {
     lua_pushnumber(lua,d);
     }
__inline void  Pop(int count)
     {
     lua_pop(lua,count);
     }
__inline int GetTop()
     {
     return lua_gettop(lua);
     }
__inline void SetTop(int top)
     {
     lua_settop(lua,top);
     }
__inline int GetType(int index)
     {
     return lua_type(lua,index);
     }
__inline const char*GetTypeName(int TypeCode)
     {
     return lua_typename(lua,TypeCode);
     }
void Error()
     {
     lua_error(lua);
     }
???

Добавлено через 46 секунд
как мне хделать много функциональней ?

Последний раз редактировалось NiTan; 18.08.2010 в 18:30.
MelKiY вне форума
Старый 14.05.2011, 11:06   #6
Maluda
Форумчанин
 
Аватар для Maluda
 
Регистрация: 18.08.2009
Сообщений: 525
Репутация: 693 (328)
По умолчанию Re: Lua+Builder

Если кому-нибудь удалось LuaBind прикрутить к CBuilder, отпишитесь пожалуйста.
Очень нужно.
Maluda вне форума
Старый 15.05.2011, 00:07   #7
Evg
Форумчанин
Эксперт C++
Автор FAQ
 
Аватар для Evg
 
Регистрация: 30.03.2009
Сообщений: 9,482
Записей в блоге: 19
Репутация: 10980 (3011)
По умолчанию Re: Lua+Builder

Byurrer, если завтра не забуду и не заломает, ты выложу короткий пример взаимодействия кодов на Си и на Lua
Evg на форуме
Старый 15.05.2011, 12:03   #8
Evg
Форумчанин
Эксперт C++
Автор FAQ
 
Аватар для Evg
 
Регистрация: 30.03.2009
Сообщений: 9,482
Записей в блоге: 19
Репутация: 10980 (3011)
По умолчанию Re: Lua+Builder

Итак, пример на взаимодействие Lua и C.
  1. Otaka расписал некую химию по части liblua. Я не сторонник таких решений, а потому пошёл по более простому пути. Скачал исходники lua-5.1.4 и затащил их в программу. Исходники весят немного, а потому такое решение мне нравится куда больше. В исходниках файлы lua.c и luac.c являются составной частью standalone интерпретатора и компилятора соотвественно, а потому cодержат функции main. Нам они не нужны, но для простоты я их оставил, просто внутренности поставил под "#if 0"
  2. В аттаче содерджится Borland'овский проект. Однако весь этот набор файлов можно затащить в любой компилятор. В частности, это дело можно под linux'ом собрать приказом "gcc File1.c lua/*.c -lm" (хотя лучше написать Makefile)
  3. В функции main есть инициализация переменной file_name. В неё пишется путь до файла example.lua, который включен в состав проекта. Здесь надо поправить на свой путь
  4. В файле example.lua в двух местах есть "Если раскомментировать" - надо раскомментировать эти строки и посмотреть, как в процессе работы программы происходит диагностика ошибок Lua

В программе из кода на Си вызывается функция на Lua, а из неё - функция на Си. Программу писал максимально примитивно, лишь для демонстрации того, как это вообще делается. В процессе исполнения программы должно вылезти вот такое

Код
1
2
In c_func: s=[aaa_qqq], i=[1200]
Finish: r=[1234]
Вложения
Тип файла: rar Lua_example.rar (173.6 Кб, 84 просмотров)
Evg на форуме
После регистрации реклама в сообщениях будет скрыта
Старый 21.05.2011, 18:39   #9
Evg
Форумчанин
Эксперт C++
Автор FAQ
 
Аватар для Evg
 
Регистрация: 30.03.2009
Сообщений: 9,482
Записей в блоге: 19
Репутация: 10980 (3011)
По умолчанию Re: Lua+Builder

Модераторы, добавьте в головной пост ссылку на пост #54 с описанием "Пример кода для взаимодействия функций Си и функций Lua: "
Evg на форуме
Закрытая тема Создать новую тему

Похожие темы
Тема Автор
Delphi для начинающих Реклама в своих приложениях
Например, в своем приложения для андроид можно засунуть рекламу, допустим системы Mobclix. Пишу программы на Delphi, можно ли туда засунуть рекламу и получать доход?
Nail-gres
Qt Как использовать русские символы в приложениях Qt?
Здравствуйте! Как сделать чтобы можно было использовать на кнопках например, русские символы? Ну что-то типа сишгоно setlocale есть?
Jumper19
Visual Basic .NET Кто-нибудь использует антикаптчу в своих приложениях?
Кто-нибудь использует антикаптчу в своих приложениях??? Если да,то если не трудно покажите пример использования. Спасибо
Replica
ASP.NET Что использовать вместо BindingSource в Windows приложениях
Добрый день Подскажите пожалуйста. В Windows проектах мы используем BindingSource для привязки обьектов В ASP.Net что заменяет BindingSource??? Спасибо
HelloWord
Visual Basic Как использовать ключ командной строки в VB приложениях?
В общем, вот и весь вопрос... Запускаю программу, в командной строке указываю параметр запуска... 'C:/MyPath/prog.exe /a' Как определить наличие этого ключа при запуске?
Maksim
Опции темы

Текущее время: 00:41. Часовой пояс GMT +4.

Компьютерный форум программистов и сисадминов
Powered by vBulletin® Version 3.8.7 PL2
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Рейтинг@Mail.ru Яндекс.Метрика