我有一个发布道具的类,我将其序列化为XML.
MyAttr = class(TCustomAttribute)
private
FName: string;
public
constructor Create(const Name: string);
property Name: string read FName write FName;
end;
MyClass = class(TPersistent)
private
FClassCaption: string;
published
[MyAttr('Class')]
property ClassCaption: string read FClassCaption write FClassCaption;
end;
Run Code Online (Sandbox Code Playgroud)
由于XML大小至关重要,我使用属性为属性提供更短的名称(即我无法定义名为'Class'的属性).序列化通过以下方式实现:
lPropCount := GetPropList(PTypeInfo(Obj.ClassInfo), lPropList);
for i := 0 to lPropCount - 1 do begin
lPropInfo := lPropList^[i];
lPropName := string(lPropInfo^.Name);
if IsPublishedProp(Obj, lPropName) then begin
ItemNode := RootNode.AddChild(lPropName);
ItemNode.NodeValue := VarToStr(GetPropValue(Obj, lPropName, False));
end;
end;
Run Code Online (Sandbox Code Playgroud)
我需要条件:如果属性标记为MyAttr,则获取"MyAttr.Name"而不是"lPropInfo ^ .Name".
我的任务是创建一个类,它将围绕多个应用程序收集用户活动.
假设我有一个类TLogging和一个名为的全局对象Logging.
用户活动(屏幕打开等)应该在内存中收集(可能放入(字符串)列表中TLogging)并在一段时间间隔(每10分钟)或应用程序关闭后保存到日志文件中.
最重要的是日志记录必须处于"静默模式",它不得以任何方式影响用户工作流程:没有屏幕挂起,没有例外.
请给我这个任务的方向.
我有dll接受来自C++的字节数组的指针,并尝试通过以下方式将此数据移动到AnsiString中
procedure Convert(const PByteArr: Pointer; ArrSize: Cardinal); export; cdecl;
var
Buf: AnsiString;
begin
SetString(Buf, PAnsiChar(PByteArr^), ArrSize);
end;
Run Code Online (Sandbox Code Playgroud)
如果我从Delphi调用这个方法
procedure Try;
var
M: TMemoryStream;
Arr: TBytes;
begin
M := TMemoryStream.Create;
try
M.LoadFromFile('myfile.dat');
SetLength(Arr, M.Size);
M.Position := 0;
M.Read(Arr[0], M.Size);
finally
M.Free;
end;
Convert(@Arr, Length(Arr));
end;
Run Code Online (Sandbox Code Playgroud)
它工作正常,但从c ++如果在SetString上提供AV.
请帮我解决一下这个.
来自RredCat:
让我为Yuriy的问题添加一些解释:首先是我们使用的语言.我们需要在C#项目中调用Delphi dll.为此,我创建了C++\CLI层(代理).现在关于头文件中的C++\CLI代码:
HINSTANCE hDelphiDLL;
typedef void (*pPBDFUNC)(byte* aBytes, int size);
pPBDFUNC Convert;
Run Code Online (Sandbox Code Playgroud)
在cpp中我在构造函数中设置Convert:
hDelphiDLL = LoadLibrary(<path to dll>);
if(NULL != hDelphiDLL ){
pPBDFUNC clb= GetProcAddress(HMODULE(hDelphiDLL), "Convert");
if(NULL != clb){
Convert= pPBDFUNC (clb); …Run Code Online (Sandbox Code Playgroud) 我有下一个数组
NAMES1: array[0..1] of string = ('NO1','NAME1');
NAMES2: array[0..1] of string = ('NO2','NAME2');
Run Code Online (Sandbox Code Playgroud)
和记录结构
TMyRec = record(
Name: ????;
);
Run Code Online (Sandbox Code Playgroud)
结果我需要声明一个常量的记录数组,如下所示
const
StringArraysList: array[0..1] of TMyRec = (
(Name: NAMES1),
(Name: NAMES2)
);
Run Code Online (Sandbox Code Playgroud)
问题是我应该在TMyRec中为Name选择什么类型?