我玩了RegSvr32.exe注册COM服务器并获得下一个退出代码:
0 - 正确注册正常的DLL Com Server时
3 - 尝试注册假DLL Com Server时(简单文本文件重命名为.DLL
4 - 尝试注册简单的DLL时,而不是Com Server
问题:我可以在哪里找到所有可能的退出代码及其含义的官方(或非官方但好的)描述?
在互联网上搜索没有给我结果,所以我发现这个主题在哪里写的退出代码与Windows系统错误代码相同,但我不明白为什么然后当尝试注册坏文件我得到代码= 3= ERROR_PATH_NOT_FOUND,并在注册非COM DLL时 - 4= ERROR_TOO_MANY_OPEN_FILES?对我来说,这听起来并不合乎逻辑.
我在表单上有一些自定义进度条,每秒更新/刷新两次,它们闪烁.
TMyProgressBar = class(TCustomControl)
Run Code Online (Sandbox Code Playgroud)
我继承了控件TCustomControl,因为我需要Handle和一些TWinControl事件.控件(最多64个项目)是动态创建的,并放在ScrollBox上.当进度更新时,我先打电话InvalidateRect.
所有的绘画工作(一组矩形,DrawText等等 - 从这里启发)都在存储器DC中执行,然后BitBlt在控制器的DC上执行.它无论如何都在闪烁,似乎组件消失并重新出现.恕我直言,它是由背景擦除引起的.
在这个无闪烁的绘图建议中,它是WM_ERASEBKGND按以下方式编写的:
type
TMyProgressBar = class(TCustomControl)
procedure WMEraseBkGnd(var Message:TMessage); message WM_ERASEBKGND;
procedure TMyProgressBar.WMEraseBkGnd(var Message: TMessage);
begin
Message.Result := 1;
end;
Run Code Online (Sandbox Code Playgroud)
但是在另一个组件中,通过TMS(TAdvProgressBar),Result设置0为相同的消息.
现在Windows文档说明:
如果应用程序删除背景,则应返回非零值; 否则,它应该返回零.
我测试了两种变体(结果= 0,1),令我惊讶的是都避免了闪烁.
那么现在,我需要在Delphi代码中加入什么?什么是正确的方法?
我必须更新一个包含超过270个更新字段的大表.
我是.NET的新手,需要建议在这种情况下使用什么更好:SqlCommand,某种内存映射表或DataSet,或者它可能存在某种使用来自DB的元数据的自动生成的对象?请帮忙.
原因:我有一个旧的大型Delphi7应用程序,其中一部分负责监听socket上的一些数据包,这些数据包被编组到大型结构中,最后一步存储在DB中.现在我将这部分移植到新的C#服务中,至少实际上我必须保留相同的逻辑.问题是结构是BIG(超过220个字段),存储它的表有近300个字段.从我的220个字段的结构中扣除/计算其他~50个字段,所有都应该在DB中更新.实际的Delphi代码是丑陋的蚂蚁它像桌子一样在几年内增长,如下所示:
'UPDATE TABLE_NAME ' +
' MSG_TYPE = ' + IntToStr(integer(RecvSruct.MSG_TYPE)) + ' ' +
' ,SomeFLOATfield = ' + FloatToStr(RecvSruct.SomeFLOATfield) + ' ' +
... //and other over 270 fileds here
'WHERE ID = ' + IntToStr(obj.ID)
Run Code Online (Sandbox Code Playgroud)
没有任何动态SQL等.其实我不能改变数据库结构..所以我必须只在代码中播放,我不确定是否有必要翻译代码.表用于某些报告和统计信息.一些计算/扣除的字段必须处理源代码中的一些常量.
使用dev-tools:MS SQL Server 2000,C#.net2.0,VS2008
我在单独的线程应用程序配置文件中进行监视,在某些情况下,该文件可能是另一个XML或另一个XML中的INI.线程监控目录代码(在Delphi中)是这样的:
procedure TWatcherThread.Execute;
type
PFileNotifyInformation = ^TFileNotifyInformation;
TFileNotifyInformation = record
NextEntryOffset: DWORD;
Action: DWORD;
FileNameLength: DWORD;
FileName: WideChar;
end;
const
BufferLength = 65536;
var
Filter, BytesRead: DWORD;
InfoPointer: PFileNotifyInformation;
Offset, NextOffset: DWORD;
Buffer: array[0..BufferLength - 1] of byte;
Overlap: TOverlapped;
Events: array[0..1] of THandle;
WaitResult: DWORD;
FileName, s: string;
begin
if fDirHandle <> INVALID_HANDLE_VALUE then begin
Filter := FILE_NOTIFY_CHANGE_LAST_WRITE;
FillChar(Overlap, SizeOf(TOverlapped), 0);
Overlap.hEvent := fChangeHandle;
Events[0] := fChangeHandle;
Events[1] := fShutdownHandle;
while not Terminated do begin
FillChar(Buffer,SizeOf(Buffer),0);
if ReadDirectoryChangesW (fDirHandle, …Run Code Online (Sandbox Code Playgroud) 我必须将部分旧的和大型应用程序从Delphi转换为.NET(C#).这是CRC32的一个奇怪的(至少对我来说)实现:
function CRC32(CRC: LongWord; Data: Pointer; DataSize: LongWord): LongWord; assembler;
asm
AND EDX,EDX
JZ @Exit
AND ECX,ECX
JLE @Exit
PUSH EBX
PUSH EDI
XOR EBX,EBX
LEA EDI,CS:[OFFSET @CRC32]
@Start: MOV BL,AL
SHR EAX,8
XOR BL,[EDX]
XOR EAX,[EDI + EBX * 4]
INC EDX
DEC ECX
JNZ @Start
POP EDI
POP EBX
@Exit: RET
DB 0, 0, 0, 0, 0 // Align Table
@CRC32: DD 000000000h, 077073096h, 0EE0E612Ch, 0990951BAh
DD 0076DC419h, 0706AF48Fh, 0E963A535h, 09E6495A3h
DD 00EDB8832h, 079DCB8A4h, 0E0D5E91Eh, 097D2D988h
DD 009B64C2Bh, …Run Code Online (Sandbox Code Playgroud) 我发送SNMP getBulkRequest,使用基于某些第三方库(如agent ++,snmp ++等)的专有SNMP浏览器,具有多个OID,例如
.1.3.6.1.2.1.1.1
.1.3.6.1.2.1.1.5
.1.3.6.1.2.1. 1.6
.1.3.6.1.2.1.1.4
是否保证返回的集合(如果存在具有此类前缀的OID)将以完全相同的顺序返回?
例如
.1.3.6.1.2.1.1.1.0
.1.3.6.1.2.1.1.5.0
.1.3.6.1.2.1.1.6.0
.1.3.6.1.2.1.1.4.0
欢迎任何答案,文档链接,与此问题相关的提示.
更新:非Repeater = 0,MaxRepetitions> = 1
如何将此代码从Delphi转换为C#?我需要struct与unmaneged代码进行交互.
TDataTypeParam = packed record
dtType : integer;
case integer of
cInt :(dtInt : integer);
cFloat :(dtFloat : real);
cLongInt :(dtLongInt : Int64);
cDateTime:(dtDateTime : TDateTime);
cShortStr:(dtShortString : ShortString);
end;
TDataParam = packed record
NumberParam : integer;
Param : array [1..MaxParam] of TDataTypeParam;
end;
TEvData = packed record
dm : TDateTime;
CodeEV : integer;
IDCAM : integer;
Reserv1 : integer;
Data : TDataParam;
end;
TArrSrvData = packed record
NumberPack : integer;
Address : Cardinal;
tpCL : integer;
tpEv : integer; …Run Code Online (Sandbox Code Playgroud) 我遵循 Debezium 教程(https://github.com/debezium/debezium-examples/tree/master/tutorial#using-postgres),所有从 Postgres 收到的 CDC 数据都以 JSON 格式发送到 Kafka 主题,并带有 schema -如何获取摆脱架构?
这是连接器的配置(在 Docker 容器中启动)
{
"name": "inventory-connector",
"config": {
"connector.class": "io.debezium.connector.postgresql.PostgresConnector",
"tasks.max": "1",
"key.converter.schemas.enable": "false",
"value.converter.schemas.enable": "false",
"database.hostname": "postgres",
"database.port": "5432",
"database.user": "postgres",
"database.password": "postgres",
"database.dbname" : "postgres",
"database.server.name": "dbserver1",
"schema.include": "inventory"
}
}
Run Code Online (Sandbox Code Playgroud)
JSON 架构仍在消息中。仅当使用以下环境变量启动 Docker 容器时,我才设法摆脱它:
- CONNECT_KEY_CONVERTER_SCHEMAS_ENABLE=false
- CONNECT_VALUE_CONVERTER_SCHEMAS_ENABLE=false
Run Code Online (Sandbox Code Playgroud)
为什么我无法通过连接器配置实现完全相同的效果?
具有架构的 Kafka 消息示例:
{"schema":{"type":"struct","fields":[{"type":"int32","optional":false,"field":"id"}],"optional":false,"name":"dbserver1.inventory.customers.Key"},"payload":{"id":1001}} {"schema":{"type":"struct","fields":[{"type":"struct","fields":[{"type":"int32","optional":false,"field":"id"},{"type":"string","optional":false,"field":"first_name"},{"type":"string","optional":false,"field":"last_name"},{"type":"string","optional":false,"field":"email"}],"optional":true,"name":"dbserver1.inventory.customers.Value","field":"before"},{"type":"struct","fields":[{"type":"int32","optional":false,"field":"id"},{"type":"string","optional":false,"field":"first_name"},{"type":"string","optional":false,"field":"last_name"},{"type":"string","optional":false,"field":"email"}],"optional":true,"name":"dbserver1.inventory.customers.Value","field":"after"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"version"},{"type":"string","optional":false,"field":"connector"},{"type":"string","optional":false,"field":"name"},{"type":"int64","optional":false,"field":"ts_ms"},{"type":"string","optional":true,"name":"io.debezium.data.Enum","version":1,"parameters":{"allowed":"true,last,false"},"default":"false","field":"snapshot"},{"type":"string","optional":false,"field":"db"},{"type":"string","optional":false,"field":"schema"},{"type":"string","optional":false,"field":"table"},{"type":"int64","optional":true,"field":"txId"},{"type":"int64","optional":true,"field":"lsn"},{"type":"int64","optional":true,"field":"xmin"}],"optional":false,"name":"io.debezium.connector.postgresql.Source","field":"source"},{"type":"string","optional":false,"field":"op"},{"type":"int64","optional":true,"field":"ts_ms"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"id"},{"type":"int64","optional":false,"field":"total_order"},{"type":"int64","optional":false,"field":"data_collection_order"}],"optional":true,"field":"transaction"}],"optional":false,"name":"dbserver1.inventory.customers.Envelope"},"payload":{"before":null,"after":{"id":1001,"first_name":"Sally","last_name":"Thomas","email":"sally.thomas@acme.com"},"source":{"version":"1.4.1.Final","connector":"postgresql","name":"dbserver1","ts_ms":1611918971029,"snapshot":"true","db":"postgres","schema":"inventory","table":"customers","txId":602,"lsn":34078720,"xmin":null},"op":"r","ts_ms":1611918971032,"transaction":null}}
Run Code Online (Sandbox Code Playgroud)
示例(我想要的)没有模式:
{"id":1001} {"before":null,"after":{"id":1001,"first_name":"Sally","last_name":"Thomas","email":"sally.thomas@acme.com"},"source":{"version":"1.4.1.Final","connector":"postgresql","name":"dbserver1","ts_ms":1611920304594,"snapshot":"true","db":"postgres","schema":"inventory","table":"customers","txId":597,"lsn":33809448,"xmin":null},"op":"r","ts_ms":1611920304596,"transaction":null}
Run Code Online (Sandbox Code Playgroud)
Debezium 容器使用以下命令运行:
docker run -it --name connect -p 8083:8083 -e GROUP_ID=1 -e …Run Code Online (Sandbox Code Playgroud) 我有In-proc(DLL)COM Server,但是我决定以DllSurrogate的身份运行,因此出于以下原因,我从非托管代码(Delphi)获得了:
function TComWrapper.GetServer: IUnknown;
begin
OleCheck(CoCreateInstance(ServerData^.ClassId, nil, CLSCTX_LOCAL_SERVER, IUnknown, Result));
end;
Run Code Online (Sandbox Code Playgroud)
从C#开始正在使用:
[DllImport("ole32.dll", EntryPoint = "CoCreateInstance", CallingConvention = CallingConvention.StdCall)]
static extern UInt32 CoCreateInstance([In, MarshalAs(UnmanagedType.LPStruct)] Guid rclsid,
IntPtr pUnkOuter, UInt32 dwClsContext, [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid,
[MarshalAs(UnmanagedType.IUnknown)] out object rReturnedComObject);
Run Code Online (Sandbox Code Playgroud)
...
UInt32 dwRes = CoCreateInstance(ClassIdGuid,
IntPtr.Zero,
(uint)(CLSCTX.CLSCTX_LOCAL_SERVER), //if OR with CLSCTX_INPROC_SERVER then INPROC Server will be created, because of DLL COM Server
IUnknownGuid,
out instance);
Run Code Online (Sandbox Code Playgroud)
上面的代码不安全。上面是否存在安全版本CoCreateInstance?看来这Activator.CreateInstance对我没有帮助。我必须设置明确运行的上下文(第三个参数)
我正在研究小型监控应用程序,它将通过SNMP,TCP,ICMP与某些设备进行通信,其他线程必须执行一些计算.所有这些结果我必须在GUI(一些Forms或TabSheets)中输出.
我正在考虑下一个可能性:
Synchronize从每一个工作者线程: Synchronize,但仅限于GUI专用线程,或GUI上的Critical Section来显示消息. TTimer主要形式,它将定期检查(100-1000毫秒)共享缓冲区并消耗,而不是Windows消息传递.(它对消息传递有一些好处吗?)亲爱的专家,请解释什么是最佳实践或暴露的替代品的优缺点是什么.
更新:
作为想法:
//共享缓冲区+发送消息变量
LogEvent全局函数将从任何地方调用(也来自工作线程):
procedure LogEvent(S: String);
var
liEvent: IEventMsg;
begin
liEvent := TEventMsg.Create; //Interfaced object
with liEvent do
begin
Severity := llDebug;
EventType := 'General';
Source := 'Application';
Description := S;
end;
MainForm.AddEvent(liEvent); //Invoke main form directly
end;
Run Code Online (Sandbox Code Playgroud)
在主窗体中,事件ListView和共享部分(fEventList: TTInterfaceList已经是线程安全的)我们将:
procedure TMainForm.AddEvent(aEvt: IEventMsg);
begin
fEventList.Add(aEvt);
PostMessage(Self.Handle, WM_EVENT_ADDED, 0, 0);
end;
Run Code Online (Sandbox Code Playgroud)
消息处理程序
procedure WMEventAdded(var Message: TMessage); message WM_EVENT_ADDED;
...
procedure TMainForm.WMEventAdded(var …Run Code Online (Sandbox Code Playgroud)