小编ALZ*_*ALZ的帖子

RegSvr32退出代码文档?

我玩了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?对我来说,这听起来并不合乎逻辑.

windows com dll winapi regsvr32

27
推荐指数
3
解决办法
2万
查看次数

如何处理WM_ERASEBKGND以避免闪烁?

我在表单上有一些自定义进度条,每秒更新/刷新两次,它们闪烁.

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代码中加入什么?什么是正确的方法?

delphi winapi gdi flicker delphi-7

9
推荐指数
1
解决办法
7082
查看次数

更新大表(很多列).C#.NET

我必须更新一个包含超过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

.net c# sql ado.net sql-server-2000

7
推荐指数
1
解决办法
1314
查看次数

为什么只有FILE_NOTIFY_CHANGE_LAST_WRITE过滤器的ReadDirectoryChangesW会在文件编辑时发出多个事件的信号?

我在单独的线程应用程序配置文件中进行监视,在某些情况下,该文件可能是另一个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 readdirectorychangesw

5
推荐指数
1
解决办法
1396
查看次数

将Delphi +汇编程序CRC32实现转换为C#

我必须将部分旧的和大型应用程序从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)

c# delphi assembly crc32 crc

4
推荐指数
2
解决办法
1082
查看次数

具有多个OID的SNMP getBulkRequest - 哪个是返回的响应OID顺序?

我发送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

networking snmp mib

4
推荐指数
1
解决办法
2059
查看次数

将Delphi变体记录转换为C#

如何将此代码从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)

c# delphi pinvoke marshalling

4
推荐指数
1
解决办法
1165
查看次数

如何在 Kafka Source Connector(例如 Debezium)中禁用 JSON 模式

我遵循 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)

jsonschema apache-kafka apache-kafka-connect debezium

4
推荐指数
1
解决办法
5646
查看次数

.NET中的CoCreateInstance完全匹配?

我有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对我没有帮助。我必须设置明确运行的上下文(第三个参数)

.net c# windows com interop

3
推荐指数
1
解决办法
5147
查看次数

从Thread发布消息到GUI最佳实践?

我正在研究小型监控应用程序,它将通过SNMP,TCP,ICMP与某些设备进行通信,其他线程必须执行一些计算.所有这些结果我必须在GUI(一些Forms或TabSheets)中输出.

我正在考虑下一个可能性:

  • 使用Synchronize从每一个工作者线程:
  • 使用共享缓冲区和Windows消息传递机制.线程将消息放入共享缓冲区(队列),并将通过Windows消息通知GUI.
  • 使用单独的线程,它将侦听同步原语(事件,信号量等)并再次使用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)

delphi messaging multithreading delphi-7

3
推荐指数
1
解决办法
2382
查看次数