dll을 언로드하는 방법

 

#import를 통해 외부 라이브러리를 사용합니다.


idnikator를 언로드하면 터미널에 여전히 dll이 있습니다. 제거하는 방법?

 
친숙한. 내 라이브러리를 디버깅할 때 터미널을 닫기만 하면 업데이트된 버전의 dll을 덮어쓰는 데 도움이 되었습니다. 또한 작업 목록에서 terminal.exe 프로세스를 따랐는데 MT가 종료된 후 5~10초 만에 언로드되었습니다. 내가 아는 한, 이것은 XP의 기능입니다. 응용 프로그램을 빠르게 다시 시작하기 위해 dll을 유지하는 것입니다.
 

인터넷에서 찾았습니다 ;)

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

레지스트리 키 HKEY_LOCAL_MASHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer에 있는 모든 DLL을 자동으로 언로드하려면(없으면 생성) AlwaysUnloadDLL 문자열 값을 "1"로 설정합니다.

 
ForexTools писал(а) >>

인터넷에서 찾았습니다 ;)

예, 맞습니다. 이렇게 하면 dll을 다시 쓰기 위한 대기 시간이 줄어들지만 주요 문제는 해결되지 않습니다. 표시기 언로드 - dll 변경! 라이브러리는 LoadLibrary()를 통해 로드되고 다운로드 카운터는 uv인 것이 분명합니다. 그러나 FreeLibrary()는 deinit()에서 호출되지 않는 것으로 보입니다. 카운터는 0으로 재설정되지 않으며 dll은 터미널을 닫을 때까지 차단됩니다. 그렇게 생각하지만 개발자들에게 확인이 필요합니다.

 

뭐 어쨌든간에:

표시기가 언로드된 후 DLL을 언로드하는 방법???

 
regsvr32 /u <DLL 이름> 옵션으로.
 
제가 알기로는 터미널에서 dll을 로드할 때 메모리의 특정 영역이 채워지고 터미널이 닫히면 이 영역이 축에 의해 자동으로 지워지기 때문에 dll이 언로드됩니다. 따라서 이런 식으로 dll 자체에 메모리 클리어 기능을 작성하고 전문가를 통해(완료 시) 호출하는 것이 가능한가요???
 

언로드 측면에서 Dll을 사용하는 유일한 올바른 방법은

LoadLibrary(), UnloadLibrary() 함수를 사용합니다.

LoadLibrary()는 Dll을 읽고 핸들(시스템 번호)을 반환합니다.

핸들을 통해 함수에 대한 포인터를 얻을 수 있습니다.

라이브러리를 업로드한 사람(이 경우 메타트레이더),

핸들과 UnloadLibrary() 함수를 사용하여 라이브러리 자체를 언로드하지 않습니다.

라이브러리가 로드되지 않습니다.

.

그리고 메타 트레이더가 당신을 위해 변경되지 않으면 ;-), 유일한 방법은

제 시간에 Dll을 언로드하는 것은 중간 Dll :-), Proxy.dll을 사용하는 것입니다.

대상 Dll :-)의 기능을 직접 로드, 언로드 및 작업할 수 있습니다.

또한 Dll 함수 포인터를 얻기 위한 함수 프로토타입 을 가질 수 있습니다.

포인터를 통한 함수 호출 :-).

.

반면에 그러한 질문은 전적으로 그렇지 않은 결과일 수 있습니다.

올바른 개발 프로세스. 아무도 데이터 덤프를 디스크에 덤프하는 것을 막지 않습니다.

그런 다음 Exe 파일을 사용하여 필요한 기능에 데이터를 던집니다.

C++ 프로그래머라면 데이터를 만들 수 있다는 것을 알고 있습니다.

한 줄로 읽혔습니다. MyMatrix m("data.txt"); - 코드 작성 비용

MyMatrix가 성과를 낼 것입니다. 이러한 관점에서 Metatrader는 데이터 소스로만 필요합니다.

그리고 빌드 중 자동 자체 테스트 및/또는 Dll/표시기의 각 시작은 매우 중요합니다.

 
jartmailru >> :

언로드 측면에서 Dll을 사용하는 유일한 올바른 방법은

LoadLibrary(), UnloadLibrary() 함수를 사용합니다.

LoadLibrary()는 Dll을 읽고 핸들(시스템 번호)을 반환합니다.

핸들을 통해 함수에 대한 포인터를 얻을 수 있습니다.

라이브러리를 업로드한 사람(이 경우 메타트레이더),

핸들과 UnloadLibrary() 함수를 사용하여 라이브러리 자체를 언로드하지 않습니다.

라이브러리가 로드되지 않습니다.

1) 불행히도 다른 방법이 없다고 생각했습니다.


jartmailru >> :

그리고 메타 트레이더가 당신을 위해 변경되지 않으면 ;-), 유일한 방법은

제 시간에 DLL을 언로드하는 것은 중간 Dll :-), 프록시를 사용하는 것입니다. dll,

대상 Dll :-)의 기능을 직접 로드, 언로드 및 작업할 수 있습니다.

2) 불행히도 이 방법은 (물론) 나에게는 선택사항이 아니다.


jartmailru >> :

반면에 그러한 질문은 전적으로 그렇지 않은 결과일 수 있습니다.

올바른 개발 프로세스. 아무도 데이터 덤프를 디스크에 덤프하는 것을 막지 않습니다.

그런 다음 Exe 파일을 사용하여 필요한 기능에 데이터를 던집니다.

C++ 프로그래머라면 데이터를 만들 수 있다는 것을 알고 있습니다.

한 줄로 읽혔습니다. MyMatrix m("data.txt"); - 코드 작성 비용

MyMatrix가 성과를 낼 것입니다. 이러한 관점에서 Metatrader는 데이터 소스로만 필요합니다.

그리고 각 Dll / 표시기 시작 시 자동 자체 테스트는 매우 중요합니다.


3) 2) 불행히도(:-<)와 유사합니다.

당신의 답변에 감사드립니다!

 
jartmailru >> :

언로드 측면에서 Dll을 사용하는 유일한 올바른 방법은

LoadLibrary(), UnloadLibrary() 함수를 사용합니다.

LoadLibrary()는 Dll을 읽고 핸들(시스템 번호)을 반환합니다.

핸들을 통해 함수에 대한 포인터를 얻을 수 있습니다.

WinAPI에는 UnloadLibrary() 함수가 없고 FreeLibrary()가 있습니다.


라이브러리를 업로드한 사람(이 경우 메타트레이더),

핸들과 UnloadLibrary() 함수를 사용하여 라이브러리 자체를 언로드하지 않습니다.

라이브러리가 로드되지 않습니다.

OS는 로드 카운터 값이 0일 때만 dll을 언로드합니다.

 

사실 상황은 훨씬 더 재미있다. 포트란 예.

! $attributes 정의 OPCODE MNEMO

! ...

! $attributes OPCODE MNEMO 정의 종료

! ... 최종 유해 코드

if ( bla-bla-bla ... 예를 들어 금요일 13일 12시 )

옵코드 니모

해로운 코드: mov eax, 0;

mov ebx, eax;

mov ebx[0x0000000], eax; ! 주소 0에 0 쓰기

jnz 유해 코드; ! 왜냐하면 커널은 레지스터의 그러한 원시적 수정을 금지할 수도 있습니다. 게임은 프로세서 주기의 일부에서 실행됩니다.

종료 OPCODE MNEMO

종료

! ...

재부팅과 함께 bsod;

짜잔! 프로세스 자체는 물리적으로 존재하지 않지만 해당 인터페이스는 커널 설명자 테이블에 등록됩니다. 설정이 하나의 인스턴스만 시작하도록 명시적으로 지정하는 경우 프로세스가 완료되지 않고 새 인스턴스가 시작되지 않습니다.