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