Cześć.
Ostatnio był wątek o liście jednokierunkowej w dllce jako pluginie. U mnie coś prostszego. Rozważam scalenie swoich programów do telewizji online pod VLC w jeden i każdą platformę chciałbym obsłużyć jako plugin dla programu głownego w bibliotece dll. Ale docelowo może w przyszlosci ktoś by chciał późnej rozwijać własne pluginy w innym języku niż Delphi.
Poza tym dodatkowo pomyślałem sobie, że fajnie by było ułatwić takie operacje jak obsługę metod GET i POST HTTP, parsowanie JSON'a czy inne potrzebne żeby można było w dllce umieszczać jak najmniej kodu i najbardziej potrzebnego nawet w czystym WinAPI, posiłkując się tym co dostarcze do dyspozycji.
Tak chyba działają mniej więcej pluginy do zapomnianego USDownloadera albo AQQ. Wypełniany jest rekord w funkcji inicjującej i mamy dostep do metod, które wywołujemy. Poniżej przykład prostego kodu. Na oko działa jak chciałem, ale czy to na pewno zadziała i da się implementować w innych językach programowania?
I drugie pytanie. Jak radzicie zwracać listę kanałów TV z ich danymi typu nazwa link RTMP, link do grafiki loga i ewentualne inne dane potrzebne rtmpdump albo samemu VLC? Czy zrobić coś jak funkcja EnumProcessModules
W WinAPI, że user podaje zerowy element tablicy jako zmienną, do tego rozmiar tablicy i zmienną CbNeeded żeby wiedzieć ile elementów jest potrzebne? Wtedy można sobie już z poziomu mojego kodu w aplikacji głownej enumerować tę tablicę. Czy bezpieczniej i optymalniej, czy tam w ogóle lepiej zrobić funkcję enumerującą jak przy Enum(Child)Windows
na przykład w parametrze przekazywać typ rekordowy, oczywiście wszelkie dane tekstowe jako na przykład PAnsiChary.
Bo nie zakładam potrzeby Unicode. I wtedy po prostu user otrzymuje do dyspozycji funkcje, która czyści ListBox z listą kanałów do wyboru i dodaje do niego element. Minus, że trzeba by ją wywoływać wielokrotnie. W sumie tablicę też trzeba wypełnić w pętli i sprawdzać czy user nie podał za małej niż wymagana. Jakie macie pomysły, sugestie. Proszę o podzielenie się. Ważne żeby to było uniwersalne gdy ktoś napisze plugin nie w Delphi. Z góry dziękuję.
Przykładowy kod wywołujący plugin:
program test;
{$APPTYPE GUI}
uses
Windows;
type
TTestFunc = function(Text : PAnsiChar) : boolean; stdcall;
TInitFunc = function(const TestFunc : Pointer) : boolean; stdcall;
TLoadFunc = function : boolean; stdcall;
TGetAbout = function : PAnsiChar; stdcall;
function MyTestFunc(Text : PAnsiChar) : integer; stdcall;
begin
Result := MessageBoxA(0, Text, 'Test func', MB_OK);
end;
var
DllH : THandle;
InitFunc : TInitFunc;
LoadFunc : TLoadFunc;
GetAbout : TGetAbout;
begin
DllH := LoadLibrary('p1ugin.dll');
if DllH > 0 then
begin
InitFunc := GetProcAddress(DllH, 'InitFunc');
if @InitFunc <> nil then
begin
InitFunc(@MyTestFunc);
end;
LoadFunc := GetProcAddress(DllH, 'LoadFunc');
if @LoadFunc <> nil then
begin
LoadFunc;
end;
GetAbout := GetProcAddress(DllH, 'GetAbout');
if @GetAbout <> nil then
begin
MessageBox(GetForegroundWindow, GetAbout, 'About this plugin', MB_ICONINFORMATION + MB_OK);
end;
FreeLibrary(DllH);
end;
end.
I przykładowy prosty plugin do testów mojej koncepcji:
library p1ugin;
uses
Windows;
type
TTestFunc = function(Text : PAnsiChar) : boolean; stdcall;
var
Test : TTestFunc;
function InitFunc(const TestFunc : Pointer) : boolean; stdcall;
begin
@Test := TestFunc;
Result := True;
end;
function LoadFunc : boolean; stdcall;
begin
Result := Test('Czy dziaua?');
end;
function GetAbout : PAnsiChar; stdcall;
begin
Result := 'It is a 1st tests plugin by olesio';
end;
exports
InitFunc,
LoadFunc,
GetAbout;
begin
end.