delphi dll + mt4 + новый билд - страница 2

 

на просторах нашол по теме https://forum.mql4.com/ru/23111

но ничего путного и рабочего по выгрузке dll из памяти я не нашол.. кто знает расскажите.. профессионалы программисты вам две минуты черкануть пару строк.. и мы благодарны будем..

 

у Windows есть настройка : выгружать неиспользуемые dll.

Ну или программно выгружай библиотеку.

 
Debugger:

у Windows есть настройка : выгружать неиспользуемые dll.

Ну или программно выгружай библиотеку.



Остается понять: что такое неиспользуемая библиотека.
 
Debugger:

у Windows есть настройка : выгружать неиспользуемые dll.

Ну или программно выгружай библиотеку.



на словах я понял.. код можете?

#import "kernel32.dll"
int GetModuleHandleA (string sss);
void FreeLibrary(int hhh);

#import

int deinit(){
int handlissimo= GetModuleHandleA("gayss.dll");
FreeLibrary(handlissimo);
return(0);
}


если так .. то неполучаеться.. все равно грузит процессор по полной..(невыгружаеться)
 

Интересно, зачем ее выгружать? Ну и пускай болтается. Вообще момент выгрузки библиотек из памяти терминала не задокументирован (я не видел), поэтому на это нельзя полагаться. Завтра возьмут и что-нибудь подкрутят. Если нужны гарантии, можно написать библиотеку обвертку, в которой вы сами загружаете/выгружаете когда вам нужно.

Обычно они выгружаются после завершения скриптов, с чего вы взяли что у вас нет? После завершения скрипта, попробуйте удалить .dll, если удалится, то она выгружена.

Без проблем возможно сделать гарантировано невыгружаемую библиотеку (выгрузится при завершении процесса терминала).

 
Интересно, зачем ее выгружать?

смотри рисунок


Ну и пускай болтается

она грузит процессор .. и второй раз нельзя обратиться к dll .. т.е. не получается даже на тесторе второй раз запустить тестирование.. приходиться вырубать ...принудительно..

Вообще момент выгрузки библиотек из памяти терминала не задокументирован (я не видел)

я тоже такого.. вот и прошу помощи у тех кто знает или может показать..

можно написать библиотеку обвертку, в которой вы сами загружаете/выгружаете когда вам нужно

промежуточную dll ? или в той же ? покажи если можешь пример..

Обычно они выгружаются после завершения скриптов, с чего вы взяли что у вас нет?

После завершения скрипта, попробуйте удалить .dll, если удалится, то она выгружена.

не удаляется.. т.е. держится терминалом.. вырубишь терминал и удалиться\перезапишеться ..

где- то писали что код dll надо уметь писать.. но сколько неищу те профи которые говорят немогут выложить рабочую систему.. простую dll я показал .. она работает без массива.. добавляешь массив(в dll).. и начинает тупить..

Без проблем возможно сделать гарантировано невыгружаемую библиотеку (выгрузится при завершении процесса терминала).
пожалуйста покажи .. как .. а то уже мозги киснут.. не могу сообразить..
 
vlad6k:

она грузит процессор .. и второй раз нельзя обратиться к dll .. т.е. не получается даже на тесторе второй раз запустить тестирование.. приходиться вырубать ...принудительно..

Значит хреново написана.
 

для кого я выше написал

это уже говорили что плохо написана.. dll ..

type
Tarray1= array[0..0] of Double;
PTarray1= ^Tarray1;
procedure test1(
name: PWideChar;// имя .. любой string
data_k: Integer;// размер массива data // обязательно!!
data: PTarray1
); stdcall;
var
q1: Integer;
begin
for q1:= 0 to 5 do begin
ShowMessage(IntToStr(q1)+ ' = '+ FloatToStr(data^[q1]));
end;
end;

что может быть проще.. тыкните пальцем что нетак..
 
В delphi не силен, примеры на C++.
vlad6k:

1. промежуточную dll ? или в той же ? покажи если можешь пример..

2. пожалуйста покажи .. как .. а то уже мозги киснут.. не могу сообразить..


1. Да, написать промежуточную либу, которая загружает/выгружает целевую.

// wrapper.dll
#include <windows.h>

HMODULE hmd = NULL;

extern "C" void load_lib()   // В msvc экспортировать немного иначе. Добавить __declspec(dllexport)
{
    hmd = LoadLibraryA("./MQL4/Libraries/my_lib.dll");
}

extern "C" void call()
{
    if(hmd)
    {
        void(*f)(void) =  (void(*)(void))GetProcAddress(hmd, "lib_fn");
        if(f)
            f();
    }
}
extern "C" void free_lib()
{
    if(hmd)
        FreeLibrary(hmd);
}

// my_lib.dll
#include <windows.h>

extern "C" void lib_fn()
{
    MessageBoxA(NULL, "", "", MB_OK);
}

// mql
#import "wrapper.dll"
    void load_lib();      // Загрузить библиотеку
    void free_lib();      // Выгрузить библиотеку
    void call();          // Какие-то функции
#import

void OnStart()
{
    load_lib();
    call();
    free_lib();
}

2. https://www.mql5.com/ru/forum/10139

 
220Volt:
Да дело не в выгрузке. Это на самом деле вообще не проблема.
Причина обращения: