Witam,
jak w temacie. Pisze dll - kontroler COM dla metatrader4.
Polaczenie do servera uzyskuje przy pomocy ponizszego kodu. Po zaimportowaniu i uruchomieniu odpowiedniego skryptu-strategii na metatraderze bibliotekczka jest bez problemu zalaczana, uruchamia sie proces MatLaba i bez problemu wykonywana jest funkcja Execute() z udostepnionego interfejsu.
library mql2mlnn;
uses
SysUtils,
Variants,
Windows,
Classes,
ComCtrls,
ComObj,
ActiveX,
StrUtils,
MLApp_TLB in 'MLApp_TLB.pas';
{$R *.res}
{ ******************************************************************************************************** }
var
ml2 : DIMLApp;
ans : UnicodeString;
{ *******************************************************************************************************}
function ML_Exec(): Integer; stdcall;
begin
try
ans := ml2.Execute('a=3');
MessageBox(0, PChar('ML_Init:' + ans), 'Message', MB_OK);
except
MessageBox(0, 'ML_Init: pooorazka', 'Message', MB_OK);
end;
end;
{***************************************************************************************************** }
exports
ML_Exec;
procedure DllMain(reason: Integer);
begin
if (reason = DLL_PROCESS_ATTACH) then
begin
end;
end; (* DllMain *)
begin
// DllProc := @DllMain;
// DllProc(DLL_PROCESS_ATTACH);
//******** Init COM/OLE interfaces ********
OleInitialize(nil);
try
ml2 := CoMLApp_.Create;
MessageBox(0, 'polaczono', 'Message', MB_OK);
except
MessageBox(0, 'nieeeeeeeee polaczono', 'Message', MB_OK);
end;
try
ans := ml2.Execute('a=3');
MessageBox(0, PChar(ans), 'Message', MB_OK);
except
MessageBox(0, 'poooorazka', 'Message', MB_OK);
end;
end.
Dygresja:
EA, czy tez program metatradera, sklada sie z trzech funkcji specjalnych: Init() - wywolywana jest raz - podczas zalaczania EA do wykresu, Start() - wykonywana kazdorazowo, gdy nadchodza nowe dane, Deinit() - nieistotne.
Funkcja 'ML_Exec()' wywolana z metatradera z wnetrza Init() (czyli bezposrednio po zalaczeniu dll) tez dziala bez zarzutu. Niestety po zakonczeniu funkcji specjalnej Init() proces MatLaba zostaje zamkniety i oczywiscie jakakolwiek interakcja z wnetrza Start() nie jest juz mozliwa.
Dodam tylko, ze sytuacja wyglada identycznie dla procesu serwera wywolywanego z wnetrza dll i serwera uruchomionego recznie.
Probowalem, znalezc jakies rozwiazanie wertujac dokumentacje COM, ale niestety bezskutecznie. Pomocy!!!
Pozdrawiam