![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Привет всем. Не спрашивайте зачем 
		
	
		
		
		
		
		
	
		
		
	
	
	При создании одного потока - все работает прекрасно и без ошибок. Если потоков 2 и больше - либо вылетает, либо сыпется различного рода ошибками, типа EAccessViolation или EInvalidPointer. Буду очень благодарен, если направите мысли в нужное русло! Всем спасибо! Код DLL: Код: 
	library gear;
 
uses
  System.SysUtils,
  System.Net.HttpClientComponent,
  System.Net.HttpClient,
  System.Net.URLClient;
 
{$R *.res}
 
function Execute: Integer; stdcall;
var
  PResponse: IHTTPResponse;
begin
  with TNetHTTPClient.Create(nil) do
    try
      PResponse := GET('https://www.google.com/');
      Result := PResponse.StatusCode;
    finally
      PResponse := nil;
      free
    end;
end;
 
exports Execute;
 
begin
 
end.Код: 
	unit TestThreadUnit;
 
interface
 
uses
  Windows,
  SysUtils,
  Classes;
 
type
  TExecute = function(): Integer;
 
  TestThread = class(TThread)
  protected
    I: Integer;
    procedure Execute; override;
  public
    constructor Create;
    procedure Sync;
  end;
 
implementation
 
uses TestUnit;
 
constructor TestThread.Create;
begin
  inherited Create(false);
end;
 
 
procedure TestThread.Execute;
var
  hndDLLHandle: THandle;
  Ex: TExecute;
begin
  try
    hndDLLHandle := loadLibrary('gear.dll');
    if hndDLLHandle <> 0 then
      begin
        @Ex := getProcAddress(hndDLLHandle, 'Execute');
        if addr(Ex) <> nil then
          I := Ex()
        else
          I := -1;
      end
    else
      I := -1;
  finally
    freeLibrary(hndDLLHandle);
    Synchronize(Sync);
  end;
end;
 
procedure TestThread.Sync;
begin
  TestForm.Memo1.Lines.Add(I.ToString);
end;
 
end.Код: 
	unit TestUnit;
 
interface
 
uses
 
  System.Classes,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.StdCtrls;
 
type
 
  TTestForm = class(TForm)
    ThreadButton: TButton;
    Memo1: TMemo;
    procedure ThreadButtonClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  TestForm: TTestForm;
 
implementation
 
uses TestThreadUnit;
 
{$R *.dfm}
 
procedure TTestForm.ThreadButtonClick(Sender: TObject);
var
  m: integer;
begin
  // for m := 0 to 1 do
  TestThread.Create.FreeOnTerminate := true;
end;
 
end. | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 1. В описании типа функции так же укажи stdcall. В твоем случае это не должно быть проблемой, т.к. это больше влияет на передачу параметров, но все-таки. 
		
	
		
		
		
		
		
	
		
		
	
	
	2. Мне не нравится, что ты пытаешься грузить библиотеку несколько раз. Попробуй вынести загрузку библиотеки и ее освобождение из потока (пока для проверки - сделай глобальную переменную для хэндла, а саму загрузку и выгрузку просто вынеси в секции initialize и finalize модуля, если все полечится, то потом можно будет переписать почеловечески).  | 
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 Runtime Packages галка снята Последний раз редактировалось darkwellroad, 22.11.2019 в 17:19.  | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 BPL - значит сами компоненты зависимы от VCL. 
		
	
		
		
		
		
		
	
		
		
	
	
	Если тебе надо просто получитьт код возврата, то попробуй вместо этих компонентов воспользоваться Indy (да, придется таскать за собой пару dll для поддержки ssl, ну или нарыть код для включеия их в exe/dll, но они не большие).  |