:: Не фоксом единым
использование форм на c# из под VFP
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
Добрый день

в старую прогу хочу начать добавлять формы на c# winforms.

конкретно сейчас речь о c# форме ADUser - из active directory считывается логины, имена, мейлы и описания пользователей. входящие в определенные группы.

Какие есть варианты вызова модальной формы на c# c параметром из vfp и возврат строки?
Предпочтительным вариантом кажется создание DLL и вызов формы из нее БЕЗ РЕГИСТРАЦИИ DLL на компьютере.
Это реально?
если да, распишите пошагово pls

вызов exe с параметром, сохранение результата в текстовый файл и считывание текстового файла из фокса кажется не красивым решением

ps. вариант написать форму на фоксе пока не рассматриваю - хочу начать интегрировать новые формы в старую прогу

[attachment 30218 2018-10-3010_43_40-C__temp_2018-10-3010_40_45-ADUserRunning-MicrosoftVisualStudio.jpg-Gre.png]



Исправлено 6 раз(а). Последнее : AlexSSS, 30.10.18 11:57
Ratings: 0 negative/0 positive
Re: использование форм на c# из под VFP
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Все молчат, скажу пару слов)))
Не понял задачи)
AlexSSS
в старую прогу хочу начать добавлять формы на c# winforms.
В прогу на фоксе?

Есть хрень, которая пытается подружить фох с шарпом.
wwDotNetBridge поиск покажет текущее положение дел.
Я когда то пробовал скрестить.
Не стоит оно того.
AlexSSS
на c# winforms.
Так же начинал с этого.
Наваял кучу классов, понаписал разной хрени.
Профита, для пользователя (по сравнению с фоксом) =0

А тут подоспели хотелки веба.
Вот знания и пригодились.)
Резюме)))
AlexSSS
хочу начать интегрировать новые формы в старую прогу
Лучше новый на NET. Постепенно.
У каждого своя ситуация.
Но я бы не в winforms делал, а на ASP.NET
И конечно, делаешь не спеша, новый проект.
Показываешь, для начала, интересные отчетные данные для руководства.
Или как вариант сервисы на NET, а формы... какие хошь. Там тока данные.

При скрещивании, упрешься в огромную кучу проблем, которые никак ни к шарпу, ни к фоксу знаний не добавят.

Слезать с фокса надо. Но скрещивание, к тому же не с Си, а нетом, думаю будет непродуктивно.
Все ИМХО.
С удовольствием прочту альтернативы.
Ratings: 0 negative/2 positive
Re: использование форм на c# из под VFP
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Да нет тут альтернатив. В плане привязать сервис какой, невизуальную компоненту - ещё туда-сюда, а формы... Коряво и нестабильно. В общем не советую.
На что переписывать - вопрос отдельный. Сейчас в тренде микросервисная архитектура, хорошая изоляция "частей" системы друг от друга позволяет на чём угодно отдельные компоненты писать, в т.ч. даже на разных языках - например что-то на дотнете, что-то на яве, что-то на каком питоне или чистом js. Фронтэнд действительно в основном вебобразный - даже если собирается в нечто типа десктопного приложения.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: использование форм на c# из под VFP
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
Владимир, Игорь, спасибо.
Больше не буду тратить время на такое скрещивание

визуальную форму реализую на VFP

но формирование части данных на c# надо оставить.
теперь задача звучит так:
как сделать невизуальную библиотеку на c#, чтобы из фокса можно было вызвать функцию с параметрами на c#?
желательно, чтобы библиотеку не надо было регистрировать в винде, просто бросил dll в папку и пользуйся.

на c# будет несколько функций, которые будут запрашивать информацию из Active Directory трех разных доменов и помещать результат (информация о пользователях и составе групп) на sql server.
ps. переписывать код этих функций на фокс с использованием adsi ldap не хочу



Исправлено 2 раз(а). Последнее : AlexSSS, 31.10.18 01:38
Ratings: 0 negative/0 positive
Re: использование форм на c# из под VFP
pasha_usue

Сообщений: 3647
Откуда: Е-бург
Дата регистрации: 06.10.2006
Так и вызывать периодически из скуля задание на сбор данных. А фоксом потом результаты смотреть.
Ratings: 0 negative/0 positive
Re: использование форм на c# из под VFP
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
AlexSSS
но формирование части данных на c# надо оставить.
Разумно)
AlexSSS
как сделать невизуальную библиотеку на c#, чтобы из фокса можно было вызвать функцию с параметрами на c#?
А это, почти как с формами. Напляшешься от души) И все вышеизложенное справедливо.
AlexSSS
на c# будет несколько функций, которые будут запрашивать информацию из Active Directory трех разных доменов и помещать результат (информация о пользователях и составе групп) на sql server.
Если так, то совет Паши, лучше не придумать.
Но если по уму. Давай подкорректируем задачу.
AlexSSS
на c# будет несколько функций, которые будут запрашивать информацию из Active Directory трех разных доменов и
и отдавать инфу, тому кто запросит.
Делаешь сервис, который вынимает эту инфу, а уж к сервису обращаешься откуда хошь. Хоть с фокса, хоть с b+++)))

Могу примерчик наваять, кинуть (хотя полагаю в инете их навалом))))
Ratings: 0 negative/0 positive
Re: использование форм на c# из под VFP
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
Аспид
Делаешь сервис, который вынимает эту инфу, а уж к сервису обращаешься откуда хошь. Хоть с фокса, хоть с b+++)))
Могу примерчик наваять, кинуть (хотя полагаю в инете их навалом))))
кинь простейший пример
Ratings: 0 negative/0 positive
Re: использование форм на c# из под VFP
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
На vs проект не имеет смысла кидать.
Речь о vs2017
Попробовал.
Просто
создать-проект-веб-веб приложение Asp.net (.Net frameWork)
Выбираешь Web Api (+MVC само встанет)

Все. Проект готов.
Там только 2 метода
Get()
Который возвращает 2 значения {"value1","value2"}
И Get(id)
Который возвращает {"value"}
Запускаешь, смотришь адрес порта
Этот адрес нужуен будет для фокса. (или для любого другого обращающегося)
Для получения данных в фоксе.
Declare Integer InternetOpen In WinInet.dll ;
String lpcAgent, ;
Integer nAccessType, ;
String lpcProxyName, ;
String lpcProxyBypass, ;
Integer nFlags
Declare Integer InternetCloseHandle In WinInet.dll ;
Integer nHandle
DECLARE INTEGER InternetSetOption IN WININET.DLL ;
INTEGER HINTERNET,;
INTEGER dwFlags,;
INTEGER @ dwValue,;
INTEGER dwBufferLength
Declare integer InternetOpenUrl in WinInet.dll ;
integer hInternet,;
string lpszUrl,;
string lpszHeaders,;
integer dwHeadersLength,;
integer dwFlags,;
integer dwContext
Declare integer InternetReadFile in WinInet.dll ;
Integer hFile,;
String @ lpBuffer,;
Integer dwNumberOfBytesToRead,;
Integer @ lpdwNumberOfBytesRead
&&Enables WinINet to perform decoding for the gzip and deflate encoding schemes.
#DEFINE INTERNET_OPTION_HTTP_DECODING 65
*Вот тут № порта вставить вместо 54203
* Это и есть метод получения данных
lcUrl="http://localhost:54203/api/Values"
*Это мой путь. Поменяй на свой
lcFile = "C:\FOXPROJ\comsale\test1.txt"
lnInetHandle = InternetOpen("VisualFoxPro", 1, .NULL., .NULL., 0)
IF lnInetHandle>0
dwFlagDecoding = 1
InternetSetOption(lnInetHandle, INTERNET_OPTION_HTTP_DECODING, @dwFlagDecoding, 4)
hUrl = InternetOpenUrl(lnInetHandle, lcUrl, 0, 0, 0, 0)
lcContent=CAST('' as blob)
hFile=-1
lnReaded=-1
m.lnBuffer=32
lcBuffer=REPLICATE(CHR(0), m.lnBuffer*1024)
jk=0
DO WHILE lnReaded#0 AND hFile#0
jk=jk+1
IF jk>1000
EXIT
ENDIF
hFile=InternetReadFile(hUrl, @lcBuffer, len(lcBuffer), @lnReaded)
lcContent=lcContent+left(lcBuffer, lnReaded)
ENDDO
IF !EMPTY(lcContent)
SET SAFETY OFF
StrToFile(lcContent, m.lcFile)
SET SAFETY ON
ENDIF
InternetCloseHandle(hFile)
InternetCloseHandle(hUrl)
ENDIF
InternetCloseHandle(lnInetHandle)
cRedist=FILETOSTR(m.lcFile)
clear
? cRedist

Ясное дело, можешь в нете, работать со своими данными, создать свой контроллер, которые будет с ними работать.
И вызов будет соответствующий.

Попробуй это, может дальше все ясно будет. Или велкам)
Ratings: 0 negative/0 positive
Re: использование форм на c# из под VFP
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
Володя, спасибо
принцип понятен ;)
но поднимать IIS для того, чтобы на нем запустить один простой сервис - задачу это не упрощает ;)

потрачу пару часов, чтобы попробовать сделать DLL и запуск процедуры из него. Если не выйдет, сделаю гораздо проще - запуск консольного приложения из фокса, которое закинет данные на SQL Server, а потом в фоксе уже вытащу актуальные данные с SQL Server.

pasha_usue
Так и вызывать периодически из скуля задание на сбор данных
Для одного домена сейчас примерно так все и работает (linked server adsi), обновление данных происходит раз в час.
Но это слишком большой промежуток для моих целей. Грузить домен контроллеры запросами каждые пять минут - нет смысла.
Запускать EXE или DLL по запросу с SQL Server мне никто не даст из-за безопасности (надо немного переконфигурить сервер)
Ratings: 0 negative/0 positive
Re: использование форм на c# из под VFP
_vit

Сообщений: 5173
Дата регистрации: 29.07.2002
AlexSSS
теперь задача звучит так:
как сделать невизуальную библиотеку на c#, чтобы из фокса можно было вызвать функцию с параметрами на c#?
желательно, чтобы библиотеку не надо было регистрировать в винде, просто бросил dll в папку и пользуйся.

на c# будет несколько функций, которые будут запрашивать информацию из Active Directory трех разных доменов и помещать результат (информация о пользователях и составе групп) на sql server.

Визуальный не визуальный без разницы.

1. Устанавливаешь пакет UnmanagedExports для студии.
Цитата:
A set of compile-time libraries (nothing to deploy) and a build task that enable you to export functions from managed code to native applications.

sites.google.com


2. Создаешь проект Class library

В свойствах проекта указываешь Platform target: x86


3. Через Manage NuGet pakages for solution добавляешь в References - RGiesecke.DllExport.Metadata

4. Пишешь код на C# что-то типа:

using RGiesecke.DllExport;
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace DllExportTemplate
{
public class Class1
{
const int CLIB_OK = 0;
const int CLIB_FAIL = 1;
[DllExport("Function1", CallingConvention = CallingConvention.Winapi)]
public static int Function1([MarshalAs(UnmanagedType.AnsiBStr)] string Arg)
{
MessageBox.Show(Arg, "C# DLL test", MessageBoxButtons.OK);
return CLIB_OK;
}
}
}



5. Код на фоксе:

DECLARE integer Function1 IN "<путь к длл-ке>\<наименование длл-ки>.dll" as CSFunction string cArg
CSFunction("Hello, I am Foxpro")
CLEAR DLLS



Исправлено 2 раз(а). Последнее : _vit, 31.10.18 19:01
Ratings: 0 negative/1 positive
Re: использование форм на c# из под VFP
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
_vit
Визуальный не визуальный без разницы.
Супер.
Надо бы попробовать.
Только придумать где)
И без всяких сервисов!
Ratings: 0 negative/0 positive
Re: использование форм на c# из под VFP
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
_vit
Визуальный не визуальный без разницы.
вау!
спасибо за пошаговую инструкцию, работает!
причем как обычная модальная форма

начинаю засовывать свою форму ;)

вызов из фокса
[attachment 30225 2018-11-0110_47_22-Corvette.png]



Исправлено 2 раз(а). Последнее : AlexSSS, 01.11.18 11:50
Ratings: 0 negative/0 positive
Re: использование форм на c# из под VFP
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
С выводом messagebox все проходит нормально

как только вместо него ставлю запуск своей формы, при вызове функции в фоксе вылетает ошибка "Declare DLL call caused an exception."
вставил обработку исключения в C# - все равно ошибка вылетает фоксовская

в visual studio никаких ошибок не показывается

нет даже идей, как отловить ошибку в самом c#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using RGiesecke.DllExport;
using System.Windows.Forms;
using ADUser;
namespace ADUserDLL
{
public class UserData
{
const int CLIB_OK = 0;
const int CLIB_FAIL = 1;
[DllExport("GetUserData", CallingConvention = CallingConvention.Winapi)]
public static int GetUserData([MarshalAs(UnmanagedType.AnsiBStr)] string Arg)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
MessageBox.Show(Arg, "C# DLL test", MessageBoxButtons.OK);
try
{
Form frm = new ADUser.frmMain();
var result = frm.ShowDialog();
// Form frm = new Form(); // а вот так работает
// var result = frm.ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "C# DLL test", MessageBoxButtons.OK);
}
return CLIB_OK;
}
}
}

оба проекта включены в одно решение
ADUser - вывод формы
ADUserDLL - собственно DLL



Исправлено 9 раз(а). Последнее : AlexSSS, 01.11.18 15:55
Ratings: 0 negative/0 positive
Re: использование форм на c# из под VFP
_vit

Сообщений: 5173
Дата регистрации: 29.07.2002
Думаешь из за нетовской формы?

Попробуй:

public class Class1
{
const int CLIB_OK = 0;
const int CLIB_FAIL = 1;
[DllExport("Function1", CallingConvention = CallingConvention.Winapi)]
public static int Function1([MarshalAs(UnmanagedType.AnsiBStr)] string Arg)
{
MessageBox.Show(Arg, "C# DLL test", MessageBoxButtons.OK);
Form1 form = new Form1(Arg);
form.ShowDialog();
return CLIB_OK;
}
}
public partial class Form1: Form
{
private Label label1 = new Label();
public string message;
public Form1(string s)
{
Text = @"My C# Form";
message = s;
this.Load += new System.EventHandler(this.Form1_Load);
}
private void Form1_Load(object sender, EventArgs e)
{
this.label1.Text = message;
this.label1.Location = new System.Drawing.Point(40, 40);
this.label1.Size = new System.Drawing.Size(120, 15);
this.Controls.Add(label1);
}
}

Думаю где то ошибка в коде с#.

Пройди программу в отладчике.
Для этого:

1. запускаешь студию с проектом длл
ставишь точку останова на первую строчку в теле функции Function1

2. запускаешь фокс но программу фоксовую пока не запускаешь.

3. в студии Debug->Attach to Process
в списке доступных процессов выбираешь vfp9.exe
кликаешь кнопку Attach
Запускается отладчик студии.

4. переходишь в фокс запускаешь программу на фоксе

5. переходишь в студию и проходишь код с# в отладчике.
Ratings: 0 negative/0 positive
Re: использование форм на c# из под VFP
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
_vit
3. в студии Debug->Attach to Process, в списке доступных процессов выбираешь vfp9.exe, кликаешь кнопку Attach. Запускается отладчик студии.
4. переходишь в фокс запускаешь программу на фоксе
5. переходишь в студию и проходишь код с# в отладчике.

В студии запускается отладчик, но при запуске проги в VFP отладчик ничего не перехватывает. Предполагаю, это связано с тем, что я запускаю уже скомпилированный DLL.
каким образом в фоксе прописать путь к DLL, чтобы отладчик отловил обращение к нему?



Исправлено 1 раз(а). Последнее : AlexSSS, 02.11.18 11:38
Ratings: 0 negative/0 positive
Re: использование форм на c# из под VFP
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Ты наверное вынул DLL из проекта VS и подсунул фоксу.
А надо думаю так.
в папке проекта VS debug... может bin ищешь эту DLL и именно этот путь подсовываешь фоксу

Посмотрел)
..\bin\debug\твоя.dll



Исправлено 1 раз(а). Последнее : Аспид, 02.11.18 12:51
Ratings: 0 negative/0 positive
Re: использование форм на c# из под VFP
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
dll ниоткуда не вытаскивал
"U:\Software\c#\ADUser\ADUserDLL\bin\Debug\ADUserDLL.dll"
сейчас у меня появилось другое подозрение - dll даже не запускается, поэтому даже try catch внутри нее и не срабатывает

обнаружил, даже если функция из dll запустилась один раз, на второй раз выллетает эта же ошибка - Declare DLL call caused an exception.
не помогают
clear all
close all
clear dlls
помогает только перезагрузка vfp

антивирус отключал - не помогает

убрал входные и выходные параметры - ничего не изменилось, срабатывает только первый раз, потом ошибка

сейчас буду искать варианты, когда в фоксе вылетает
Declare DLL call caused an exception.



Исправлено 2 раз(а). Последнее : AlexSSS, 02.11.18 14:22
Ratings: 0 negative/0 positive
Re: использование форм на c# из под VFP
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Разберешься конечно.
И все это пригодится. Но...
Я например подумал, куда б это у себя применить.
И вот к чему пришел, относительно тебя.

У тебя типичная, мкросервисная задача.
И Даже не рест, а только чтение.

Поставить IIS, это день максимум, а потом, свобода.
Я бы не бросал тот путь.
Можешь получать данные... куда угодно от такого сервиса.
Да хоть в ексель)))
Ratings: 0 negative/0 positive
Re: использование форм на c# из под VFP
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
Тут не все так просто
Я работаю в большом концерне с множеством подсетей. Мой комп многие не видят (пинг не пройдет).
IIS надо ставить где-то на основных серваках. Для этого мне нужно тех.обоснование и т.п.
А то, что через какое-то время самому все равно придется делать сервисы - да, это я понимаю.

на крайний случай у меня есть безинтерфейсный работающий вариант - запуск exe из под фокса и считывание данных из какого-то кэша (SQL, файл XML и т.п.)
Ratings: 0 negative/0 positive
Re: использование форм на c# из под VFP
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Хочется предложить вариант.
В данном случае тебе не подойдет
У тебя источник АД.

Но для другого.
Берешь вин хостинг.
Делаешь там сайт, и все что хошь)
И создаешь еще под домен, про который никто не знает.
И размещаешь там сервисы.

Конечно, надо аккуратно (очень) с доступом к БД.
Но по мне, так очень просто, и работает)

Вроде не Пентагон, никто не ломится)))
(Вернее ломится, но не пролазит)))
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 13 (Гостей: 13)

© 2000-2024 Fox Club 
Яндекс.Метрика