有几个表格的图书馆。
在其中一种形式(FAuthentication)上,“ IBDatabase2 ”位于(这是一个新组件,即没有任何东西连接到它,等等。只配置了“用户名”“密码”和“字符集”)在调用其中一个之后库函数
function BACKUP_DB(AFBackupCreate: boolean;
var APathDB: string): string; export; stdcall; far;
var
LNameDB: string;
begin
if AFBackupCreate then
begin
FAuthentication := TFAuthentication.Create(nil);
FAuthentication.IBDatabase2.DatabaseName := APathDB;
FAuthentication.IBDatabase2.Connected := true; <-- ошибка
end;
if AFBackupCreate then
begin
FreeAndNil(FAuthentication);
end;
并关闭导致内存中 dll 错误的应用程序
异常类 $C0000005 与消息“访问冲突在 0x04eda150:读取地址 0x0563e844
'。
它来自行“ FAuthentication.IBDatabase2.Connected := true”
我不知道错误可能出在哪里......
PS
- 虽然在调用同一库的其他函数时,它们工作正常
- - 向 dll 添加了一个新表单并将 IBDatabase2 扔在上面 - 效果是一样的
ShareMem在两个项目中使用?好吧,就是这样——这就是答案。
您在 exe/dll 边界传递一个字符串 - 一种数据类型,其内存和生命周期管理由编译器以隐藏在我们代码中的形式执行。这非常方便,但您需要了解它 - 仅适用于这种情况。