Диспетчер памяти библиотеки Delphi Странно - PullRequest
1 голос
/ 01 июня 2019

Я получил ошибку из DLL, скомпилированной из Delphi с использованием в c ++, работающей в многопоточности

Delphi (Architect 10.3 Version 26.0.32429.4364) Библиотечный код

library Project1;

uses
  System.SysUtils,
  System.Classes;

{$R *.res}

procedure __test(size: integer); cdecl;
var
  data : AnsiString;
begin
  SetLength(data, size);
end;

exports
  __test;

begin
end.

C ++ (Viausl Studio 2019) Загрузка библиотеки и использование многопоточности

// ConsoleApplication1.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

#include <iostream>
#include <Windows.h>
#include <thread>

typedef void(__cdecl *functest)(int);

HINSTANCE hInst = nullptr;

functest test;

void thread_loop() {
    while (1) {
        test(10);
    }
}

int main()
{
    hInst = LoadLibraryA("Project1.dll");

    if (!hInst) {
        return 0;
    }

    test = (functest)GetProcAddress(hInst, "__test");

    if (!test) {
        return 0;
    }

    std::thread t1(thread_loop);
    std::thread t2(thread_loop);

    return 1;

Я получил исключение, но оно не должно получать никаких исключений, поскольку это переменная процедуры, которая не была предоставлена ​​в общий доступ

1 Ответ

5 голосов
/ 01 июня 2019

Установите IsMultiThread на True в главном блоке вашей Delphi DLL. Диспетчер памяти Delphi по умолчанию предполагает однопоточный режим по умолчанию.

begin
  IsMultiThread := True;
end.
...