المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : إستضافة برنامج وعرضة داخل التطبيق


عبود عبود
25-05-2015, 09:47 PM
السلام عليكم ورحمة الله وبركاته


يمكن إستضافة برنامج داخل التطبيق بطرق كثيرة منها كما هو موضح بالفيديو التالى :


https://www.youtube.com/watch?v=k62r5Q0F2Jc


Source:



using RGiesecke.DllExport;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using LuaVM.Utilities.Lua;

namespace Embed
{
public class Embed
{
// DEFINICIONES

public static IntPtr L; // Almancen puntero LuaState

// Veariables que vamos a necesitar luego.
private static string exeName = "";
private static string argument = "";
public static IntPtr appWin;
public static RECT offset;
public static int width, height;

// Cosicas que necesitaremos con P/Invoke

[DllImport("user32.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
private static extern long GetWindowThreadProcessId(long hWnd, long lpdwProcessId);

[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll", SetLastError = true)]
private static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

[DllImport("user32.dll", EntryPoint = "GetWindowLongA", SetLastError = true)]
private static extern long GetWindowLong(IntPtr hwnd, int nIndex);

[DllImport("user32.dll", EntryPoint = "SetWindowLongA", SetLastError = true)]
private static extern long SetWindowLong(IntPtr hwnd, int nIndex, long dwNewLong);

[DllImport("user32.dll", SetLastError = true)]
private static extern long SetWindowPos(IntPtr hwnd, long hWndInsertAfter, long x, long y, long cx, long cy, long wFlags);

[DllImport("user32.dll", SetLastError = true)]
private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);

[DllImport("user32.dll", EntryPoint = "PostMessageA", SetLastError = true)]
private static extern bool PostMessage(IntPtr hwnd, uint Msg, long wParam, long lParam);

[DllImport("user32.dll")]
private static extern bool GetWindowRect(IntPtr hWnd, out RECT rect);

[DllImport("user32.dll")]
static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach);

[DllImport("user32.dll")]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left; // x position of upper-left corner
public int Top; // y position of upper-left corner
public int Right; // x position of lower-right corner
public int Bottom; // y position of lower-right corner
}

// HELPERS

public static void Redraw()
{
// Calcular ancho y alto con respecto a los offsets
MoveWindow(appWin, offset.Left * -1, offset.Top * -1, width + offset.Left + offset.Right, height + offset.Top + offset.Bottom, true);
}

// EXPORTS

[DllExport(CallingConvention = CallingConvention.Cdecl)] // Solo hay que esportar luaopen_* para que sea visible mediante require('*');
public static int luaopen_Embed(IntPtr Ls)
{
L = Ls; // Como esto es lo primero que se ejecuta, guardamos el puntero hacia LuaState en nuestro almacen.
Lua.register_lua_function(L, "Embed", "Start", (Lua.LuaFunction)embed_start);
Lua.register_lua_function(L, "Embed", "StartDialog", (Lua.LuaFunction)embed_startdialog);
Lua.register_lua_function(L, "Embed", "SetOffset", (Lua.LuaFunction)embed_setoffset);
Lua.register_lua_function(L, "Embed", "SetSize", (Lua.LuaFunction)embed_setsize);
Lua.register_lua_function(L, "Embed", "GetOffset", (Lua.LuaFunction)embed_getoffset);
Lua.register_lua_function(L, "Embed", "GetSize", (Lua.LuaFunction)embed_getsize);
Lua.register_lua_function(L, "Embed", "Send", (Lua.LuaFunction)embed_send);
//Registramos las funciones para que esten visibles en el motor lua
//Devolver 1 (Registrado correctamente, necesario en el motor de lua)
return 1;
}

// METODOS

public static int embed_start(IntPtr Ls)
{
//Empezamos a guardar cosas en la memoria estatica para usarlo luego
appWin = IntPtr.Zero;
exeName = Lua.lua_tostring(L, 1);
argument = Lua.lua_tostring(Ls, 2);
IntPtr handle = (IntPtr)Lua.lua_tonumber(Ls, 3);
width = (int)Lua.lua_tonumber(Ls, 4);
height = (int)Lua.lua_tonumber(Ls, 5);
int delay = (int)Lua.lua_tonumber(Ls, 6);
//Creamos el proceso y obtenermos el hwnd
ProcessStartInfo psi = new ProcessStartInfo(exeName, argument);
psi.WindowStyle = ProcessWindowStyle.Minimized;
psi.CreateNoWindow = true;
Process process = Process.Start(psi);
process.WaitForInputIdle();
Thread.Sleep(delay); // Puede variar segun la aplicacion o lo lento que valla el sistema
appWin = process.MainWindowHandle;
Thread.Sleep(10); //Por seguridad, 10ms no son nada
//Embed now
SetParent(appWin, handle);
SetWindowLong(appWin, -16, 268435456L);
AttachThreadInput(GetWindowThreadProcessId(appWin, IntPtr.Zero), GetWindowThreadProcessId(handle, IntPtr.Zero), true);
Redraw(); //Posicionar ventana inicial
Lua.lua_pushnumber(Ls, (int)appWin); //Retornar hwnd
return 1; //Retornar un argumento
}

public static int embed_startdialog(IntPtr Ls)
{
if (appWin != IntPtr.Zero) { PostMessage(appWin, 16U, 0L, 0L); /*Si habia algo previamente, lo cerramos (16 WM_CLOSE)*/ }
//Empezamos a guardar cosas en la memoria estatica para usarlo luego
appWin = IntPtr.Zero;
string dlg = Lua.lua_tostring(Ls, 1);
IntPtr handle = (IntPtr)Lua.lua_tonumber(Ls, 2);
width = (int)Lua.lua_tonumber(Ls, 3);
height = (int)Lua.lua_tonumber(Ls, 4);
//Abrimos el dialogo con un thread para poder seguir utilizando el UI de pagina, a la vez
Thread t = new Thread(new ThreadStart(delegate
{
Lua.luaL_dostring(L, "DialogEx.Show(\"" + dlg + "\", true, nil, nil);");
}));
t.IsBackground = true;
//Truco de mierda inside, creamos var global
Lua.lua_pushnumber(L, 0);
Lua.lua_setglobal(L, "dialog_window_handle");
//Añadimos al On Preload del dialogo nuestro truco de mierda para almacenar el hwnd en la variable global
Lua.luaL_dostring(L, "Application.SetDialogScript(\"" + dlg + "\", \"On Preload\", \"dialog_window_handle = DialogEx.GetWndHandle(); \"..Application.GetDialogScript(\"" + dlg + "\", \"On Preload\"))");
t.Start(); //Ejecutar el thread, se mantendra abierto mientras el dialogex
Thread.Sleep(100);//Por seguridad, 100ms no son nada
//Final del truco de mierda, leer la variable global o_O
Lua.lua_getglobal(L, "dialog_window_handle");
appWin = (IntPtr)Lua.lua_tonumber(L, -1);
Lua.lua_pop(L, 1); //x si acaso
//Embed now, ya esto igual que antes
SetParent(appWin, handle);
SetWindowLong(appWin, -16, 268435456L);
AttachThreadInput(GetWindowThreadProcessId(appWin, IntPtr.Zero), GetWindowThreadProcessId(handle, IntPtr.Zero), true);
Redraw(); //Posicionar ventana inicial
Lua.lua_pushnumber(Ls, (int)appWin); //Retornar hwnd
return 1; //Retornar un argumento
}

public static int embed_setoffset(IntPtr Ls)
{
// Rellenar las variables
offset.Top = (int)Lua.lua_tonumber(Ls, 1);
offset.Bottom = (int)Lua.lua_tonumber(Ls, 2);
offset.Left = (int)Lua.lua_tonumber(Ls, 3);
offset.Right = (int)Lua.lua_tonumber(Ls, 4);
// Redibujar
Redraw();
return 0; // no hay nada que retornar, asi que 0
}

public static int embed_getoffset(IntPtr Ls)
{
// Poner en la pila el retorno
Lua.lua_pushnumber(Ls, offset.Top);
Lua.lua_pushnumber(Ls, offset.Bottom);
Lua.lua_pushnumber(Ls, offset.Left);
Lua.lua_pushnumber(Ls, offset.Right);
return 4; //Son 4 mierdas en la pila
}

public static int embed_setsize(IntPtr Ls)
{
// Rellenar las variables again
width = (int)Lua.lua_tonumber(Ls, 1);
height = (int)Lua.lua_tonumber(Ls, 2);
// Redibujar again
Redraw();
return 0;
}

public static int embed_getsize(IntPtr Ls)
{
// Poner ancho y alto en la pila
Lua.lua_pushnumber(Ls, width);
Lua.lua_pushnumber(Ls, height);
return 2; //Son 2 mierdas las q te comes
}

public static int embed_send(IntPtr Ls)
{
// Pro zone xD
PostMessage(appWin, (uint)Lua.lua_tonumber(Ls, 1), (long)Lua.lua_tonumber(Ls, 2), (long)Lua.lua_tonumber(Ls, 3));
return 0;
}

}
}
[/syntax]

Lua.cs
[syntax=csharp]/*******************************************
* *
* LUA 5.1 TO C# P/INVOKE *
* Thue Tuxen - Shadow-FanX - Pablo Garcia *
* *
******************************************/

using System;
using System.Runtime.InteropServices;

namespace LuaVM.Utilities.Lua
{
public class Lua
{
/* mark for precompiled code (`<esc>Lua') */
public const string LUA_SIGNATURE = "\033Lua";

/* option for multiple returns in `lua_pcall' and `lua_call' */
public const int LUA_MULTRET = (-1);

/*
** pseudo-indices
*/
public const int LUA_REGISTRYINDEX = (-10000);
public const int LUA_ENVIRONINDEX = (-10001);
public const int LUA_GLOBALSINDEX = (-10002);

/* thread status; 0 is OK */
public const int LUA_YIELD = 1;
public const int LUA_ERRRUN = 2;
public const int LUA_ERRSYNTAX = 3;
public const int LUA_ERRMEM = 4;
public const int LUA_ERRERR = 5;

/*
* typedef int (*lua_CFunction) (lua_State *L);
*/
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate int LuaFunction(IntPtr lua_State);

/*
** basic types
*/
public const int LUA_TNONE = (-1);
public const int LUA_TNIL = 0;
public const int LUA_TBOOLEAN = 1;
public const int LUA_TLIGHTUSERDATA = 2;
public const int LUA_TNUMBER = 3;
public const int LUA_TSTRING = 4;
public const int LUA_TTABLE = 5;
public const int LUA_TFUNCTION = 6;
public const int LUA_TUSERDATA = 7;
public const int LUA_TTHREAD = 8;

/* minimum Lua stack available to a C function */
public const int LUA_MINSTACK = 20;

/*
** state manipulation
*/
//LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud);
//LUA_API void (lua_close) (lua_State *L);
[DllImport("lua5.1.dll")]
public static extern void lua_close(IntPtr lua_State);

//LUA_API lua_State *(lua_newthread) (lua_State *L);
[DllImport("lua5.1.dll")]
public static extern IntPtr lua_newthread(IntPtr lua_State);

//LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf);
[DllImport("lua5.1.dll")]
public static extern LuaFunction lua_atpanic(IntPtr lua_State, LuaFunction panicf);

/*
** basic stack manipulation
*/
//LUA_API int (lua_gettop) (lua_State *L);
[DllImport("lua5.1.dll")]
public static extern int lua_gettop(IntPtr lua_State);
//LUA_API void (lua_settop) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern void lua_settop(IntPtr lua_State, int idx);
//LUA_API void (lua_pushvalue) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern void lua_pushvalue(IntPtr lua_State, int idx);
//LUA_API void (lua_remove) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern void lua_remove(IntPtr lua_State, int idx);
//LUA_API void (lua_insert) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern void lua_insert(IntPtr lua_State, int idx);
//LUA_API void (lua_replace) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern void lua_replace(IntPtr lua_State, int idx);
//LUA_API int (lua_checkstack) (lua_State *L, int sz);
[DllImport("lua5.1.dll")]
public static extern void lua_checkstack(IntPtr lua_State);
//LUA_API void (lua_xmove) (lua_State *from, lua_State *to, int n);
[DllImport("lua5.1.dll")]
public static extern void lua_xmove(IntPtr lua_State_From, IntPtr lua_State_To);

/*
** access functions (stack -> C)
*/
//LUA_API int (lua_isnumber) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern int lua_isnumber(IntPtr lua_State, int idx);
//LUA_API int (lua_isstring) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern int lua_isstring(IntPtr lua_State, int idx);
//LUA_API int (lua_iscfunction) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern int lua_iscfunction(IntPtr lua_State, int idx);
//LUA_API int (lua_isuserdata) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern int lua_isuserdata(IntPtr lua_State, int idx);
//LUA_API int (lua_type) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern int lua_type(IntPtr lua_State, int idx);
//LUA_API const char *(lua_typename) (lua_State *L, int tp);
[DllImport("lua5.1.dll")]
public static extern string lua_typename(IntPtr lua_State, int tp);
//LUA_API int (lua_equal) (lua_State *L, int idx1, int idx2);
[DllImport("lua5.1.dll")]
public static extern void lua_equal(IntPtr lua_State, int idx1, int idx2);
//LUA_API int (lua_rawequal) (lua_State *L, int idx1, int idx2);
[DllImport("lua5.1.dll")]
public static extern void lua_rawequal(IntPtr lua_State, int idx1, int idx2);
//LUA_API int (lua_lessthan) (lua_State *L, int idx1, int idx2);
[DllImport("lua5.1.dll")]
public static extern void lua_lessthan(IntPtr lua_State, int idx1, int idx2);
//LUA_API lua_Number (lua_tonumber) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern double lua_tonumber(IntPtr lua_State, int idx);
//LUA_API lua_Integer (lua_tointeger) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern int lua_tointeger(IntPtr lua_State, int idx);
//LUA_API int (lua_toboolean) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern int lua_toboolean(IntPtr lua_State, int idx);
//LUA_API const char *(lua_tolstring) (lua_State *L, int idx, size_t *len);
[DllImport("lua5.1.dll")]
public static extern string lua_tolstring(IntPtr lua_State, int idx, UIntPtr len);
//LUA_API size_t (lua_objlen) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern int lua_objlen(IntPtr lua_State, int idx);
//LUA_API lua_CFunction (lua_tocfunction) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern LuaFunction lua_tocfunction(IntPtr lua_State, int idx);
//LUA_API void *(lua_touserdata) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern IntPtr lua_touserdata(IntPtr lua_State, int idx);
//LUA_API lua_State *(lua_tothread) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern IntPtr lua_tothread(IntPtr lua_State, int idx);
//LUA_API const void *(lua_topointer) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern IntPtr lua_topointer(IntPtr lua_State, int idx);

/*
** push functions (C -> stack)
*/
//LUA_API void (lua_pushnil) (lua_State *L);
[DllImport("lua5.1.dll")]
public static extern void lua_pushnil(IntPtr lua_State);
//LUA_API void (lua_pushnumber) (lua_State *L, lua_Number n);
[DllImport("lua5.1.dll")]
public static extern void lua_pushnumber(IntPtr lua_State, double n);
//LUA_API void (lua_pushinteger) (lua_State *L, lua_Integer n);
[DllImport("lua5.1.dll")]
public static extern void lua_pushinteger(IntPtr lua_State, int n);
//LUA_API void (lua_pushlstring) (lua_State *L, const char *s, size_t l);
//LUA_API void (lua_pushstring) (lua_State *L, const char *s);
[DllImport("lua5.1.dll")]
public static extern void lua_pushstring(IntPtr lua_State, string s);
//LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt,
// va_list argp);
//LUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...);
//LUA_API void (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n);
//[DllImport("lua5.1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)]
[DllImport("lua5.1.dll")]
public static extern void lua_pushcclosure(IntPtr lua_State, [MarshalAs(UnmanagedType.FunctionPtr)] LuaFunction func, int n);

//LUA_API void (lua_pushboolean) (lua_State *L, int b);
[DllImport("lua5.1.dll")]
public static extern void lua_pushboolean(IntPtr lua_State, int b);
public static void lua_pushboolean(IntPtr lua_State, bool b)
{
if (b)
lua_pushboolean(lua_State, 1);
else
lua_pushboolean(lua_State, 0);
}

//LUA_API void (lua_pushlightuserdata) (lua_State *L, void *p);
//LUA_API int (lua_pushthread) (lua_State *L);

/*
** get functions (Lua -> stack)
*/
//LUA_API void (lua_gettable) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern void lua_gettable(IntPtr lua_State, int idx);
//LUA_API void (lua_getfield) (lua_State *L, int idx, const char *k);
[DllImport("lua5.1.dll")]
public static extern void lua_getfield(IntPtr lua_State, int idx, string s);
//LUA_API void (lua_rawget) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern void lua_rawget(IntPtr lua_State, int idx);
//LUA_API void (lua_rawgeti) (lua_State *L, int idx, int n);
[DllImport("lua5.1.dll")]
public static extern void lua_rawgeti(IntPtr lua_State, int idx, int n);
//LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec);
[DllImport("lua5.1.dll")]
public static extern void lua_createtable(IntPtr lua_State, int narr, int nrec);
//LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz);
//LUA_API int (lua_getmetatable) (lua_State *L, int objindex);
[DllImport("lua5.1.dll")]
public static extern int lua_getmetatable(IntPtr lua_State, int objindex);
//LUA_API void (lua_getfenv) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern void lua_getfenv(IntPtr lua_State, int idx);

/*
** set functions (stack -> Lua)
*/
//LUA_API void (lua_settable) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern void lua_settable(IntPtr lua_State, int idx);
//LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k);
[DllImport("lua5.1.dll")]
public static extern void lua_setfield(IntPtr lua_State, int idx, string s);

//LUA_API void (lua_rawset) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern void lua_rawset(IntPtr lua_State, int idx);
//LUA_API void (lua_rawseti) (lua_State *L, int idx, int n);
[DllImport("lua5.1.dll")]
public static extern void lua_rawseti(IntPtr lua_State, int idx, int n);
//LUA_API int (lua_setmetatable) (lua_State *L, int objindex);
[DllImport("lua5.1.dll")]
public static extern int lua_setmetatable(IntPtr lua_State, int objindex);
//LUA_API int (lua_setfenv) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern int lua_setfenv(IntPtr lua_State, int idx);

/*
** `load' and `call' functions (load and run Lua code)
*/
//LUA_API void (lua_call) (lua_State *L, int nargs, int nresults);
[DllImport("lua5.1.dll")]
public static extern void lua_call(IntPtr lua_State, int nargs, int nresults);
//LUA_API int (lua_pcall) (lua_State *L, int nargs, int nresults, int errfunc);
[DllImport("lua5.1.dll")]
public static extern int lua_pcall(IntPtr lua_State, int nargs, int nresults, int errfunc);
//LUA_API int (lua_cpcall) (lua_State *L, lua_CFunction func, void *ud);
//LUA_API int (lua_load) (lua_State *L, lua_Reader reader, void *dt,
// const char *chunkname);

//LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data);


/*
** coroutine functions
*/
//LUA_API int (lua_yield) (lua_State *L, int nresults);
//LUA_API int (lua_resume) (lua_State *L, int narg);
//LUA_API int (lua_status) (lua_State *L);

/*
** garbage-collection function and options
*/
//#define LUA_GCSTOP 0
//#define LUA_GCRESTART 1
//#define LUA_GCCOLLECT 2
//#define LUA_GCCOUNT 3
//#define LUA_GCCOUNTB 4
//#define LUA_GCSTEP 5
//#define LUA_GCSETPAUSE 6
//#define LUA_GCSETSTEPMUL 7

//LUA_API int (lua_gc) (lua_State *L, int what, int data);
[DllImport("lua5.1.dll")]
public static extern int lua_gc(IntPtr lua_State, int what, int data);

/*
** miscellaneous functions
*/
//LUA_API int (lua_error) (lua_State *L);
[DllImport("lua5.1.dll")]
public static extern int lua_error(IntPtr lua_State);
//LUA_API int (lua_next) (lua_State *L, int idx);
[DllImport("lua5.1.dll")]
public static extern int lua_next(IntPtr lua_State, int idx);

//LUA_API void (lua_concat) (lua_State *L, int n);
[DllImport("lua5.1.dll")]
public static extern void lua_concat(IntPtr lua_State, int n);
//LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud);
//LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud);


[DllImport("lua5.1.dll")]
public static extern int luaL_ref(IntPtr lua_State, int t);

/*
** ================================================== =============
** some useful macros
** ================================================== =============
*/

//#define lua_pop(L,n) lua_settop(L, -(n)-1)
public static void lua_pop(IntPtr lua_State, int amount)
{
lua_settop(lua_State, -(amount) - 1);
}

//#define lua_newtable(L) lua_createtable(L, 0, 0)
public static void lua_newtable(IntPtr lua_State)
{
lua_createtable(lua_State, 0, 0);
}

//#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))
public static void lua_register(IntPtr lua_State, string n, LuaFunction func)
{
lua_pushcfunction(lua_State, func);
lua_setglobal(lua_State, n);
}

//#define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0)
public static void lua_pushcfunction(IntPtr lua_State, LuaFunction func)
{
lua_pushcclosure(lua_State, func, 0);
}

//#define lua_strlen(L,i) lua_objlen(L, (i))
public static void lua_strlen(IntPtr lua_State, int i)
{
lua_objlen(lua_State, i);
}

//#define lua_isfunction(L,n) (lua_type(L, (n)) == LUA_TFUNCTION)
public static bool lua_isfunction(IntPtr lua_State, int n)
{
return lua_type(lua_State, n) == LUA_TFUNCTION ? true : false;
}
//#define lua_istable(L,n) (lua_type(L, (n)) == LUA_TTABLE)
public static bool lua_istable(IntPtr lua_State, int n)
{
return lua_type(lua_State, n) == LUA_TTABLE ? true : false;
}
//#define lua_islightuserdata(L,n) (lua_type(L, (n)) == LUA_TLIGHTUSERDATA)
//#define lua_isnil(L,n) (lua_type(L, (n)) == LUA_TNIL)
public static bool lua_isnil(IntPtr lua_State, int n)
{
return lua_type(lua_State, n) == LUA_TNIL ? true : false;
}
//#define lua_isboolean(L,n) (lua_type(L, (n)) == LUA_TBOOLEAN)
public static bool lua_isboolean(IntPtr lua_State, int n)
{
return lua_type(lua_State, n) == LUA_TBOOLEAN ? true : false;
}
//#define lua_isthread(L,n) (lua_type(L, (n)) == LUA_TTHREAD)
//#define lua_isnone(L,n) (lua_type(L, (n)) == LUA_TNONE)
public static bool lua_isnone(IntPtr lua_State, int n)
{
return lua_type(lua_State, n) == LUA_TNONE ? true : false;
}
//#define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0)
public static bool lua_isnoneornil(IntPtr lua_State, int n)
{
return lua_type(lua_State, n) <= 0 ? true : false;
}

//#define lua_pushliteral(L, s) \
// lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1)

//#define lua_setglobal(L,s) lua_setfield(L, LUA_GLOBALSINDEX, (s))
public static void lua_setglobal(IntPtr lua_State, string s)
{
lua_setfield(lua_State, LUA_GLOBALSINDEX, s);
}

//#define lua_getglobal(L,s) lua_getfield(L, LUA_GLOBALSINDEX, (s))
public static void lua_getglobal(IntPtr lua_State, string s)
{
lua_getfield(lua_State, LUA_GLOBALSINDEX, s);
}

//#define lua_tostring(L,i) lua_tolstring(L, (i), NULL)
public static string lua_tostring(IntPtr lua_State, int i)
{
return lua_tolstring(lua_State, i, UIntPtr.Zero);
}

/*
** compatibility macros and functions
*/
[DllImport("lua5.1.dll")]
public static extern IntPtr luaL_newstate();

//#define lua_open() luaL_newstate()
public static IntPtr lua_open()
{
return luaL_newstate();
}

/* open all previous libraries */
//LUALIB_API void (luaL_openlibs) (lua_State *L);
[DllImport("lua5.1.dll")]
public static extern void luaL_openlibs(IntPtr lua_State);

[DllImport("lua5.1.dll")]
public static extern void luaL_openlib(IntPtr lua_State, string name, luaL_Reg[] tab_funcs, int nup);

//#define lua_getregistry(L) lua_pushvalue(L, LUA_REGISTRYINDEX)

//#define lua_getgccount(L) lua_gc(L, LUA_GCCOUNT, 0)

//#define lua_Chunkreader lua_Reader
//#define lua_Chunkwriter lua_Writer

/* hack */
//LUA_API void lua_setlevel (lua_State *from, lua_State *to);

//LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s);
[DllImport("lua5.1.dll")]
public static extern int luaL_loadstring(IntPtr lua_State, string s);

//#define luaL_dostring(L, s) \
//(luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0))
public static int luaL_dostring(IntPtr lua_State, string s)
{
if (luaL_loadstring(lua_State, s) != 0)
return 1;
return lua_pcall(lua_State, 0, LUA_MULTRET, 0);
}

//LUALIB_API int (luaL_loadfile) (lua_State *L, const char *filename);
[DllImport("lua5.1.dll")]
public static extern int luaL_loadfile(IntPtr lua_State, string s);

//#define luaL_dofile(L, fn) \
//(luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))
public static int luaL_dofile(IntPtr lua_State, string s)
{
if (luaL_loadfile(lua_State, s) != 0)
return 1;
return lua_pcall(lua_State, 0, LUA_MULTRET, 0);
}

public static void register_lua_function(IntPtr L, string tableName, string funcName, Lua.LuaFunction funcPointer)
{ // Helper para agregar funciones en Lua dentro de una tabla.
Lua.lua_getfield(L, Lua.LUA_GLOBALSINDEX, tableName); // push table onto stack
if (!Lua.lua_istable(L, -1)) // not a table, create it
{
Lua.lua_createtable(L, 0, 1); // create new table
Lua.lua_setfield(L, Lua.LUA_GLOBALSINDEX, tableName); // add it to global context
Lua.lua_pop(L, 1); // reset table on stack // pop table (nil value) from stack
Lua.lua_getfield(L, Lua.LUA_GLOBALSINDEX, tableName); // push table onto stack
}
Lua.lua_pushstring(L, funcName); // push key onto stack
Lua.lua_pushcfunction(L, funcPointer); // push value onto stack
Lua.lua_settable(L, -3); // add key-value pair to table
Lua.lua_pop(L, 1); // pop table from stack
}
}

public class luaL_Reg
{
public string name;
public Lua.LuaFunction f;
}
}






المثال المفتوح :

إستضافة وفتح برنامج داخل التطبيق (https://mega.co.nz/#!5ZBk3LxR!vAwq0nB9F9Dm8QbJIzrDlOJjbtfLWRtMacre4x5 W3OE)


أو رابط مباشر Dropbox


إستضافة وفتح برنامج داخل التطبيق (https://dl.dropboxusercontent.com/u/29881160/Embed.apz)


أو رابط mega


إستضافة وفتح برنامج داخل التطبيق (https://mega.co.nz/#!5ZBk3LxR!vAwq0nB9F9Dm8QbJIzrDlOJjbtfLWRtMacre4x5 W3OE)

ثامر أبو بلقيس
25-05-2015, 10:52 PM
شكرا جزيلا :abc_138:

azizsoft
26-05-2015, 01:05 AM
بسم الله الرحمن الرحيم

بارك الله فيكم أخي امير ونفع بكم
:abc_022:

انـا مسلم
26-05-2015, 01:15 AM
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية . :abc_050:

المـهاجر
26-05-2015, 10:13 AM
لو امكن الرفع على مركز آخر
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية .

فرح صالحي
26-05-2015, 10:25 AM
شـكــ وبارك الله فيك ـــرا لك :abc_152:... لك مني أجمل تحية .

أبو يوسف
26-05-2015, 02:00 PM
جزاك الله خيرا أخانا عبود عبود :abc_152: وبارك الله فيك

ميزو فوكس
27-05-2015, 02:26 AM
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية .

كاو دهوكي
27-05-2015, 02:37 PM
شـكــ وبارك الله فيك ـــرا لك ...:abc_022: .

بس بصراحة لم افهم اي شئ من كلامه

عبود عبود
27-05-2015, 06:32 PM
لو امكن الرفع على مركز آخر



تم وضع رابط مباشر Dropbox

وأيضا تم وضع رابط على سيرفر mega

ياسرهتهت
27-05-2015, 06:36 PM
بسم الله الرحمن الرحيم
شكرا لك وبارك الله فيك استاذ /عبود
موفق بإذن الله ... لك مني أجمل تحية .

عبود عبود
27-05-2015, 06:37 PM
مرور جميل منكم جميعا

تمنياتى لكـــــم بالتوفيق

:abc_152:

المـهاجر
28-05-2015, 10:38 AM
تم وضع رابط مباشر Dropbox

وأيضا تم وضع رابط على سيرفر mega

مشكلة مركز mega هى إصراره على تغيير نسخة الفلاش بلاير
شكرا على رابط Dropbox
تم التحميل
عمل جيد و الطريقة جيدة جدا و البرنامج المستضاف يلتحم مع المضيف
تحياتى لكل من ساهم فى هذا العمل
:abc_022:

ثامر أبو بلقيس
28-05-2015, 11:31 AM
للإفادة : أرسلت رسالة للقائمين على مركز الخليج أثناء عملية التطوير لادراج دعم ملفات apz
لذا يمكن التجربة للتأكد من هاته الخدمة بالتوفيق :abc_138:


استعملت الملف في استدعاء الايكسل و دمجه الى صفحة web
لكن عند الطباعة لم يطبع ما تم دمجه للأسف كانت أمنية

عبود عبود
31-05-2015, 12:10 AM
استعملت الملف في استدعاء الايكسل و دمجه الى صفحة web
لكن عند الطباعة لم يطبع ما تم دمجه للأسف كانت أمنية

ما هى مشاكل الطباعة التى تواجهك ربما أستطيع أن أجد حلا لها معك
هل تستعرضها " المشاكل " بالتفصيل ؟

ثامر أبو بلقيس
31-05-2015, 12:56 AM
السلام عليكم ورحمة الله وبركاته

أخي عبود مشاكلي معي الطباعة وقفت الكثير من أعمالي لو كانت الطباعة عبارة عن تقارير

لكان الامر سهل باستعمال الفرونت بيج أو ما شابه

المشكل الرئيس هو أن جل أعمالي عبارة عن جداول مدرسية أو جداول مخزونات تعرف بأن الـ grid

يحقق لنا ذلك لكن كيف لي أن أضع لتلك الوثيقة المكونة من جداول علما أن هذه الجداول تزداد صفوفها مع البيانات المدخلة

قلت كيف أجعل لتلك الجداول عناوين لها مكونة من أسطر
الفرونت بيج لا يحقق لنا توسع في الجداول الــ grid يستمد عنوان الوثيقة فقط من اسم الصفحة
جربت ارسال المعلومات للايكسل أي نعم حقق لي ما أريد لكن بطيء جدا كلما ازدادت البيانات
سيقى يشغلني كيف أصل الى التحكم في عنوان الــ grid أو كيف أجعل مقبض نافذة المشروع تقبل تعدد الاسطر
في عنوانها أو حل آخر تلك مشكلتي القديمة و الجديدة و التي أقضي الساعات في الانترنت للبحث عن حل لها
و لم أجد للأسف
شكرا :abc_138:

ثامر أبو بلقيس
01-06-2015, 01:55 AM
لن تنشعل بالطلب أستاذ عبود حل المشكل ووجدت طريقة للحل
سريعة و لله الحمد :abc_138:
شكرا جزيلا :abc_138:

امل الماضي
01-06-2015, 05:16 AM
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية .

الهمام
03-06-2015, 03:02 PM
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية .

عبود عبود
03-06-2015, 03:13 PM
لن تنشعل بالطلب أستاذ عبود حل المشكل ووجدت طريقة للحل
سريعة و لله الحمد :abc_138:
شكرا جزيلا :abc_138:


أتمنى لك التوفيق أخى الكريم

وجميل جدا لو عرفتها منك " إلى ماذا توصلت "

:abc_138:

ثامر أبو بلقيس
03-06-2015, 04:13 PM
أتمنى لك التوفيق أخى الكريم

وجميل جدا لو عرفتها منك " إلى ماذا توصلت "

:abc_138:

بطبيعة الحال سأشير للخطوة الأولى
أو الطريق للحل للتعامل مع هكذا حالات

01 - افتح مشروعا جديدا و ضمنه grid لا تستعمل فيه خلايا fixed
وليكن عدد الصفوف 3000 و الأعمدة 10 مقصود هذا العدد الكبير
02 - فعل الاضافة luacom و الاضافة Clipboard
03 - ازرع في زر ما الكود التالي لتعبئة الـ grid
for i = 1,3000 do
for h = 0 ,10 do
Grid.SetCellText("Grid1", i ,h , i, true);
end
end
04 - ضع زر آخر من خلاله سسننقل محتوى الـ grid إلى الايكسل بسرعة
و لاحظ تركت الايكسل مفتوح للتتم المعاينة و تركت الأسطر العلوية شاغرة
لأنها هي التي ستحمل معلومات و عنوان المطبوع
Grid.SelectAll("Grid1");
Grid.EditCopy("Grid1");
result = Clipboard.GetText();
----------------------------------------------
local excel = luacom.CreateObject("Excel.Application")
excel.Visible = true
local wb = excel.Workbooks:Add()
local ws = wb.Worksheets(1)
Grid.SelectAll("Grid1");
Grid.EditCopy("Grid1");
RangeRef = "A2:j2999"
local BorderList = ws:Range(RangeRef)
BorderList:select();
ws:Paste()

عند تنفيذ العمل تكون صفحات الايكسل مغلقة حتى لا تحدث أخطاء
وحتى المسارات لا تكون عربية و خاصة عنوان المشروع :abc_138:

---------------------------
كانت هذه هي الخطوة الاولى و يمكنك استنباط الباقي في كيفية الاستغلال

ثامر أبو بلقيس
03-06-2015, 04:41 PM
نسسيت أن أقول جرب كتابة بالعربي في الـ grid ليتم نقلها بدون استغلال الاضافة Clipboard لا أضن يحدث ذلك
بالبليجين luacom لوحده
- بعد نجاح العمل ... تبقى خطوة - لا أريد العمل في مصنف افتراضي بل مصنف عندي و يحفظ ما أرسل له و هو مغلق
و عند أمر الطباعة يطبع الصفحة المرسل لها البيانات
و تتدعيم خلايا الايكسل بتنسسيق شرطي مفاده اذا كانت الخلية غير شاغرة ترسم لها حدود أي رم الجدول تلقائي
---------------
ويبقى التنفيذ و الاستفادة حسب الخبرة في التعامل مع كلا البرنامجين الايكسل و الاوتوبلاي
----
للأمانة عني وجدت في البداية صعوبة ثم حولت كل أعمالي بهذه التقنية + استعمال sql للتخزين و تحقيق
سرعة اضافية

بالتوفيق :abc_138:

عبود عبود
03-06-2015, 06:20 PM
سوف أقوم بالتجربة اليوم إن شاء الله
وأعطى لك رأى فى هذا الخصوص

:abc_152:

ثامر أبو بلقيس
03-06-2015, 06:28 PM
نعم بالتوفيق فالغاية مهمة جدا تخيل تصبح أعمالك بالاضافة للطباعة مدعومة بكل
أشكال الإحصائيات و الرسومات و المنحنيات البيانية و ووو .... ستضاف للأوتوبلاي متعة برمجية منقطعة النظير
موفق :abc_138:

عبود عبود
03-06-2015, 08:41 PM
تمت التجربة ويتم نسخ المحتويات فى الأكسيل
ولكن ما كنت تقصده كان الطباعة فكيف تتم هذه العمليه ؟

عبود عبود
03-06-2015, 08:45 PM
أيضا اللغة العربية لم يتم نسخها إلى الأكسيل

ثامر أبو بلقيس
03-06-2015, 08:49 PM
باستغلال File.Print فقط يتم طباعة الورقة المستقبلة للبيانات
و المحددة في الجزئية local ws = wb.Worksheets(1)

طبعا قبل الحديث عن الطباعة الأهم هو كيف يتم هذا العمل على نموذج
مساره داخل الاوتوبلاي ذاك هو المعني بالطباعة :abc_138:

ثامر أبو بلقيس
03-06-2015, 08:51 PM
أيضا اللغة العربية لم يتم نسخها إلى الأكسيل

لكن عندي تعمل عادي جدا

ثامر أبو بلقيس
03-06-2015, 08:52 PM
ساحاول رفع ملف مرئي

عبود عبود
03-06-2015, 08:56 PM
فى الإنتظار فى أى وقت
تحياتى

ثامر أبو بلقيس
03-06-2015, 09:00 PM
http://im45.gulfup.com/lJo4HN.swf

عبود عبود
04-06-2015, 12:16 AM
تمام تمام تنتقل الكتابة العربية بشكل صحيح عندما تكتب يدويا كما فى شرحك فى العنصر Grid
أما إذا كانت مضافة للعنصر Grid عن طريق ملئ العنصر بالتكرار أو بواسطة أمر التكرار لا يتم نسخة فى الإكسيل
بشكل صحيح فيكون رموز غير مفهومة

--
for i = 1,3000 do
for h = 0 ,10 do
Grid.SetCellText("Grid1", i, h, "عبووود"..i, true);
end
end

ثامر أبو بلقيس
04-06-2015, 01:09 AM
السلام عليكم ورحمة الله وبركاته

هات تقييم اذ حل المشكل :abc_141:

for i = 1,3000 do
for h = 0 ,10 do
Grid.SetCellText("Grid1", i, h, "عبود"..i, true);
end
end
DLL.CallFunction("user32.dll", "LoadKeyboardLayoutA", "\"00000401\", 1", DLL_RETURN_TYPE_LONG, DLL_CALL_STDCALL)

عبود عبود
04-06-2015, 01:15 AM
جارى تنصيب الأوفيس مرة أخرى بعد حذفة

ثامر أبو بلقيس
04-06-2015, 01:18 AM
ريثما تنصب الاوفيس ... الحل يكمن في التساؤل
لماذا يدوي ينسخ بشكل صحيح و العكس لا ؟؟ الفارق الوحيد هو
توجه المؤشر و من وجهة نظري يكون حلا منطقبا
----
مع ملاحظة اذ كنت تستعمل في برامجك الباركود أثناء تسجيل مخزونات مثلا أو عملية بيع وجب ارجاع المؤشر لغير العربية
موفق أخي :abc_138:

عبود عبود
04-06-2015, 01:35 AM
ريثما تنصب الاوفيس ... الحل يكمن في التساؤل
لماذا يدوي ينسخ بشكل صحيح و العكس لا ؟؟ الفارق الوحيد هو
توجه المؤشر و من وجهة نظري يكون حلا منطقبا
----
مع ملاحظة اذ كنت تستعمل في برامجك الباركود أثناء تسجيل مخزونات مثلا أو عملية بيع وجب ارجاع المؤشر لغير العربية
موفق أخي :abc_138:


جزاك الله خيرا أخى تمت التجربة بالتركيز بالماوس على الخلية وتغيير لغة الإدخال فقط إلى العربية وتمت بنجاح
وأيضا كود تغيير أو تبديل لغة الإدخال فكرتة رائعة جدا

شكرا جزيلا :abc_138::abc_152:

http://i.imgur.com/JrpWJYl.jpg

ثامر أبو بلقيس
04-06-2015, 01:40 AM
سعدت أني قدمت لك و لو شيء بسيط نظير ما تقدمه للزملاء

في المرة القادمة عندما نجد فرصة حوار مماثلة سأوصل لك الطريقة العكسية

أي من الايكسل الى الاوتوبلاي و كذلك كيفية التحكم في الخلايا في حد ذاتها

و كذلك عملية محو ما تمت كتابته كل هذا و أكثر مقترن بالوقت لا أكثر تقديري :abc_138:

عبود عبود
04-06-2015, 01:43 AM
تحياتى وتقديرى لك ولشخصك الكريم

طابت أوقاتك بالخير دائما

:abc_138:

ثامر أبو بلقيس
04-06-2015, 01:47 AM
نلتقي بود أستاذي الكريم :abc_138:

ثامر أبو بلقيس
04-06-2015, 04:42 PM
02 - فعل الاضافة luacom و الاضافة clipboard
04 - ضع زر آخر من خلاله سسننقل محتوى الـ grid إلى الايكسل بسرعة
و لاحظ تركت الايكسل مفتوح للتتم المعاينة و تركت الأسطر العلوية شاغرة
لأنها هي التي ستحمل معلومات و عنوان المطبوع
grid.selectall("grid1");
grid.editcopy("grid1");
result = clipboard.gettext();
----------------------------------------------
local excel = luacom.createobject("excel.application")
excel.visible = true
local wb = excel.workbooks:add()
local ws = wb.worksheets(1)
grid.selectall("grid1");
grid.editcopy("grid1");
rangeref = "a2:j2999"
local borderlist = ws:range(rangeref)
borderlist:select();
ws:paste()


ربما لاحظت أن بالنقاش ليلة الامس يمكن لنا التخلي عن بعض الأسطر
و معها عن الاضافة clipboard
ليصبح الكود المسؤول عن نقل محتوى خلابا GRID
هو :
DLL.CallFunction("user32.dll", "LoadKeyboardLayoutA", "\"00000401\", 1", DLL_RETURN_TYPE_LONG, DLL_CALL_STDCALL)
Grid.SelectAll("Grid1");
Grid.EditCopy("Grid1");
----------------------------------------------
local excel = luacom.CreateObject("Excel.Application")
excel.Visible = true
local wb = excel.Workbooks:Add()
local ws = wb.Worksheets(1)
RangeRef = "A2:j2999"
local BorderList = ws:Range(RangeRef)
BorderList:select();
ws:Paste()

------------ ربحنا التخلي عن الاضافة clipboard و استعمالها في الايكسل و مشاكلها :abc_086:

ثامر أبو بلقيس
04-06-2015, 06:04 PM
في المرة القادمة إن شاء الله
سنتخلى عن الاضافة luacom و كود تغيير أو تبديل لغة الإدخال :abc_065:

امل الماضي
04-06-2015, 06:17 PM
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية .
موفق بإذن الله ... لك مني أجمل تحية .

الجارف
06-06-2015, 06:33 PM
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية .

أبو صخر
10-06-2015, 12:51 PM
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية . موفق بإذن الله ... لك مني أجمل تحية .

محمد فرحات
11-06-2015, 04:06 PM
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية .

فاضل الجبوري
27-06-2015, 10:16 PM
السلام عليكم ورحمة الله وبركاته

كمبيو فون
28-06-2015, 06:59 PM
رائع والله

كمال الجزائري
28-06-2015, 07:02 PM
جزاكم الله كل خير

احمد حاتم احمد
03-08-2015, 04:41 AM
شكرا وبارك الله فيك اخي عبود :abc_114:

ابو احمد النائلي
09-08-2015, 08:44 PM
السلام عليكم ورحمة الله وبركاته موفق بإذن الله ... لك مني أجمل تحية .

عبدوعزيز
14-11-2015, 05:12 PM
مشكووووووووووور

ببداية
18-12-2015, 11:04 PM
بس بصراحة لم افهم اي شئ من كلامه
:abc_085:

رفعت صبحى
19-12-2015, 05:38 AM
مششششششششششششششششكككككككك كووووووووور

محمد بن عطية
22-12-2015, 11:06 AM
السلام عليكم ورحمة الله وبركاته شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية . :abc_026::abc_026::abc_026:

محمد سامر
10-08-2016, 06:56 PM
موفق بإذن الله ... لك مني أجمل تحية .

سموحة
13-08-2016, 01:48 AM
بارك الله فيكم أخي امير ونفع بكم

محمد امير محمد امير
04-09-2016, 01:35 PM
بارك اللة فيك

منار بربرة
30-10-2016, 02:21 PM
بارك الله فيكم

علي قد حالي
20-02-2017, 02:29 AM
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية .

هاني شاهين
15-03-2017, 05:21 PM
مشكورررررررررررررر

السعيد الجزائري
26-03-2017, 08:58 AM
السلام عليكم ورحمة الله وبركاته موفق بإذن الله ... لك مني أجمل تحية . :abc_026::abc_026::abc_026:

محمد بن أحمد أبو حذيفة
29-03-2017, 02:53 PM
بسم الله الرحمن الرحيم
الحمدلله والصلاة والسلام على رسول الله وعلى آله وصحبه أجمعين
موفق بإذن الله ... لك مني أجمل تحية .

المـهاجر
26-04-2017, 12:03 AM
فى الحقيقة انا اتساءل عن امكانية ارجاع قيم من التطبيق المستضاف
موفق

محمد كريم
02-08-2018, 10:56 PM
بارك الله فيك اخي الكريم

مدحت الدويري
19-03-2019, 10:13 PM
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية .

مارجوم،
20-03-2019, 12:15 AM
tnks bro..........

ازرتي
27-09-2019, 07:28 PM
:abc_139: مشكور

حروف الزخرفة
27-10-2019, 08:52 PM
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية .

سمسم يو
27-01-2020, 01:57 AM
الحمدلله والصلاة والسلام على رسول الله وعلى آله وصحبه أجمعين

الأطولي
20-08-2020, 10:32 PM
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية .

سامى الغزالى
29-01-2021, 04:14 PM
بارك الله فيك

بوجمعة ب
31-01-2021, 05:18 PM
بارك الله فيكم أخي:abc_114:

سمير المخفي
01-02-2021, 03:57 PM
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية . :abc_050:

محمدالورافي
06-02-2021, 04:59 PM
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية .