- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Delphi 10.1 中编写了一个 DLL,它使用 Devart IBDac 组件来允许在安装中备份和恢复 Firebird DB(应用程序从 Firebird 1.5 升级到 3)。使用 Ansi Inno Setup 5.5.9 一切正常。正如我想避免 AnsiString
和PAnsiChar
作为参数(为了更方便地从 Delphi 使用)我安装了 Inno Setup Unicode 版本 5.5.9(u) 并从 AnsiString
更改了参数/PAnsiChar
至String
在 DLL 和 Inno 安装脚本中。我也尝试过WideString
在 Inno Setup 脚本中但这根本不起作用。 PChar
Inno Setup 无法识别。
奇怪的是,脚本部分工作,参数正确传输到 DLL,但我在与参数无关的情况下遇到 GPF:
我认为参数类型是这个邪恶的根源。这是我在 DLL 和脚本中更改的唯一内容。带有 AnsiString
的版本仍然工作得很好。
感谢您分享有关我在这里做错的任何想法。
更新:根据要求的示例代码:
从资源运行脚本的 Delphi 过程在第一条语句中失败。与MessageBox
在第一行中,我验证了所有参数是否正确到达。
procedure runScript(aServer, aDatabase, aUser, aPW, aPort, DLL, script: String); stdcall;
var
ResStream: TResourceStream;
DB: TIBCConnection;
SC: TIBCScript;
{ Muss Ansistring sein wegen Resourcestream }
s: ansistring;
begin
try
DB := TIBCConnection.create(nil);
SC := TIBCScript.create(nil);
SC.Connection := DB;
try
DB.clientlibrary := DLL;
DB.Database := aDatabase;
DB.Server := aServer;
DB.Username := aUser;
DB.Password := aPW;
DB.Port := aPort;
DB.connected := true;
ResStream := TResourceStream.create(hInstance, script, RT_RCDATA);
setlength(s, ResStream.size);
ResStream.ReadBuffer(s[1], ResStream.size);
SC.SQL.Text := String(s);
SC.Execute;
DB.close;
finally
SC.free;
DB.free;
end;
except
on e: Exception do
begin
MessageBox(0, PChar(e.message), PChar('Setup - Fehler in "' + script + '"'), mb_ok);
raise;
end;
end;
end;
Inno Setup (Unicode) 中过程的定义。其他所需的 DLL 在第一个函数定义中声明,因此它们都存在。它适用于 AnsiString
/PAnsiChar
!
procedure runScript(aServer, aDatabase, aUser, aPW, aPort, DLL, script: String);
external 'runScript@files:itcsetupfb.dll stdcall setuponly';
此恢复函数有效,但仅当我不在函数中使用 TRIM() 时:
procedure restoreDB(destServer, destDatabase, destSysdbaPW, aBackupfile, aPort, DLL: String; PBRange: integer;
PbHandle, LblHandle, WizHandle: THandle); stdcall;
var
IBCRestoreService1: TIBCRestoreService;
cnt: integer;
s: String;
Msg: TMsg;
begin
IBCRestoreService1 := TIBCRestoreService.create(nil);
SendMessage(PbHandle, PBM_SETRANGE, 0, PBRange shl 16);
cnt := 0;
try
try
with IBCRestoreService1 do
begin
clientlibrary := DLL;
Database.Text := destDatabase;
Server := destServer;
Username := 'sysdba';
Password := destSysdbaPW;
Port := aPort;
Options := [roFixFssMetadata, roNoValidityCheck, roFixFssData, roOneRelationAtATime, roDeactivateIndexes];
FixFssCharset := 'ISO8859_1';
BackupFile.Text := aBackupfile;
PageSize := 16384;
verbose := true;
Attach;
try
ServiceStart;
while IsServiceRunning do
begin
inc(cnt);
if cnt > PBRange then
cnt := 0;
s := GetNextLine + ' ';
{ this was formerly s:=trim(strinGreplace(s,'gbak:','', }
{ [rfReplaceall,rfIgnoreCase])). I Identified the trim to be the }
{ cause of the GPF. Very strange. }
delete(s, 1, 5);
while (length(s) > 0) and (s[1] = #32) do
delete(s, 1, 1);
{ if we have no message file (local fb15) }
if pos('format message', s) > 0 then
s := 'Arbeite ...';
SendMessage(LblHandle, $0C, 0, longint(s));
SendMessage(PbHandle, PBM_SETPOS, cnt, 0);
while PeekMessage(Msg, WizHandle, 0, 0, PM_REMOVE) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
UpdateWindow(PbHandle);
end;
finally
detach;
end;
end;
finally
IBCRestoreService1.free;
end;
except
on e: Exception do
begin
MessageBox(0,
PChar('Die Wiederherstellung der EMILpro Datenbank ist leider fehlgeschlagen. Folgender Fehler trat auf: ' +
#13#10#10 + e.message), 'Setup - Fehler bei Wiederherstellung', mb_ok);
raise;
end;
end;
end;
该函数在 Inno Setup 中声明如下:
procedure restoreDB(destServer, destDatabase, destSysdbaPW, aBackupfile, aPort, DLL: String;
PBRange: integer; PbHandle,LblHandle,WizHandle: THandle);
external 'restoreDB@files:itcsetupfb.dll,fbclient.dll,gds32.dll,icudt52.dll,icudt52l.dat,icuin52.dll,icuuc52.dll,fbintl.dll,firebird.conf,firebird.msg,ib_util.dll,engine12.dll,msvcp100.dll,msvcr100.dll,fbintl.conf stdcall setuponly';
最佳答案
您不能在 Inno Setup 的 DLL API 中使用 string
类型,至少有两个原因:
当您将函数参数声明为 string
时,Inno Setup 将始终假定实际参数类型为 PChar
。
string
是“智能”类型,它执行内部分配和引用计数。此类无法通过 DLL 边界,因为 DLL 无法释放应用程序分配的内存,反之亦然,因为每个类都有自己的内存管理器。此外,类的内存布局和内部逻辑可能因 Delphi 版本(用于构建 Inno Setup 和 DLL 的版本)而异。
在 Delphi 中将参数实现为 PWideChar
(= PChar
),并在 Unicode Inno Setup 中将参数声明为 (wide) string
。我没有看到在 Delphi 中使用 PWideChar
作为“in”参数有任何不便。您可以在任何可以使用字符串
的地方使用它。
类似的讨论,请参阅
Exchanging strings (PChar) between a Freepascal compiled DLL and a Delphi compiled EXE
关于delphi - Inno Setup Delphi DLL中的Unicode版本和字符串参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40362634/
我还没有找到太多关于何时使用 Unicode 的(简明)信息。我知道很多人说最佳实践是始终使用 Unicode。但 Unicode 字符串确实有更多的内存占用。我是否正确地说,必须仅在以下情况下使用
我正在构建一个需要使用表情符号的应用程序,特别是生成大量随机表情符号序列。这需要有一个大列表可供选择。而不是采取方法 detailed here通过循环硬编码十六进制范围,我决定采用不同的方法并从 t
早在 ZX Spectrum 的早期,就有一种方法可以将一个字形打印在另一个字形之上,从而在 OVER 1 指令的帮助下创建复合字形。 我想知道是否有 Unicode 方法可以在现代计算机上执行相同的
我有一个表示 Unicode 代码点的字符串,例如 "272d"。如何将其转换为 "✭"? Elixir 当然理解 Unicode: iex> > "✭" iex> "x{272d}" "✭" 但我需
自从我了解到 clang 能够编译用 Unicode 编写的 c++ 源文件后,我在编写与数学相关的代码时就开始大量使用它。比较 uₙ₊₁ᵖ = A*uₙ + B*uₙ₋₁; uₙ₊₁ᶜ = π *
感谢jmcnamara我发现了一种在 xlsxwriter 图表中使用 Unicode 字符的好方法:xlsxwrter: rich text format in chart title 我需要一个所
有些字符不包含在 Unicode 中(即带重音的西里尔字母),但可以使用组合序列创建。据我了解,可能的组合字符序列是在布局引擎和/或使用的字体中定义的。我对吗?那么,如何得到所有可能的组合序列呢? 最
我正在尝试使用 libunibreak ( https://github.com/adah1972/libunibreak ) 来标记某些给定 unicode 文本中可能的换行符。 Libunibre
我需要具有属性 Alphabetic 的 Unicode 字符范围列表如 http://www.unicode.org/Public/5.1.0/ucd/UCD.html#Alphabetic 中所定
我想为 Unicode 中的特定字符找到视觉上相同的字符。 我知道如何找到一个字符的规范或兼容性分解;但他们没有给我我想要的。 我想找到视觉上相同(不相似)的字符,它们唯一的区别可能是它们的大小。 例
假设我有包含此字符串的 Apache Solr 索引文档: Klüft skräms inför 我希望能够使用此关键字通过搜索找到它(注意“u”-“ü”): kluft 有没有办法做到这一点 ? 最
我已经阅读了很多文章以了解 Unicode 代码点的最大数量,但我没有找到最终答案。 我知道 Unicode 代码点已最小化,以使所有 UTF-8 UTF-16 和 UTF-32 编码都能够处理相同数
我正在使用 CSS Buttons With Icons But No Images . 图标是使用 unicode 值生成的。在这方面,我遇到了一些浏览器不支持某些 unicode 值的问题。因此,
我正在寻找一种方法将 Unicode 字母字符从任何语言音译为带重音的拉丁字母。目的是让外国人深入了解以任何非拉丁文字书写的姓名和单词的发音。 例子: 希腊语:Romanize("Αλφαβητικό
Unicode 6.0 添加了几个带有描述的字符,表明这些字符应该以特定颜色呈现: 红苹果 U+1F34E 青苹果 U+1F34F 蓝心U+1F499 绿心U+1F49A 黄心U+1F49B 紫心U+
我想知道,Unicode 中的每个字符都有一个代码点;字体中字符的类似术语是什么? 当解码文件需要映射到字体(或字体,通过一些现代字体替换技术)时,我从来没有理解过程的一部分。 例如,当文本编辑器从其
谁能告诉我 Unicode 可打印字符的范围是多少? [例如。 Ascii 可打印字符范围为\u0020 -\u007f] 最佳答案 参见,http://en.wikipedia.org/wiki/U
鉴于Unicode有been around for 18 years ,为什么还有不支持 Unicode 的应用程序?甚至我对某些操作系统和 Unicode 的体验至少可以说是痛苦的。正如乔尔·斯波尔
我要求计算 Unicode 中所有可能的有效组合的数量并附上解释。我知道一个 char 可以编码为 1、2、3 或 4 个字节。我也不明白为什么连续字节有限制,即使该字符的起始字节清除了它应该有多长。
Unicode 为中文字符分配了 U+4E00..U+9FFF。这是全套的一部分,但不是全部。 最佳答案 最终列表可以在 Unicode Character Code Charts 找到;在页面中搜索
我是一名优秀的程序员,十分优秀!