程序使用的程序和dll(都是在Delphi上编写的,代码都可以访问).在程序中有一个程序X,它根据来自dll的程序Y的询问推断出一些统计数据(在计时器上).过程Y在dll中发生某些事件时变得更加活跃,这可能在不同的时间间隔内出现.
问题:是否可以在dll中传输名称程序X,并在程序Y中执行它,以便立即了解发生的事件,而不是在计时器上查询它.再次(或作为变体):如何在程序中定义,dll中有什么事件并执行过程X的代码?如果有可能,那就是一个代码示例.
DelphiXe; XP,VISTA,Win7的,WSrv2008R2;

支持0.DEP(数据执行保护)CPU
Function isCpuDEP:bool;
begin
Result:=... //???
end;
Run Code Online (Sandbox Code Playgroud)
1.如何定义,DEP在系统中是ON?
Function isEnableDEP:bool; // Win Xp comparable
begin
Result:=false;if isCpuDEP=false then exit;
Result:=... //???
end;
Run Code Online (Sandbox Code Playgroud)
2.定义,如果DEP已启用,并且还启用了所有程序和服务?
Function isEnableDEPForAllProgram:bool;
begin
Result:=false;if isEnableDEP=false then exit;
Result:=... //???
end;
Run Code Online (Sandbox Code Playgroud)
3.获取DEP程序列表?
Function GetDEPProgramList:TStringList;
begin
Result:=nil;if isEnableDEPForAllProgram=false then exit;
Result:=Tstringlist.Create;
Result:=... //???
end;
Run Code Online (Sandbox Code Playgroud) 德尔福Xe.
在模块Windows.pas中,我看到一种方法:
function InterlockedExchangeAdd(Addend: PLongint; Value: Longint): Longint stdcall; overload;
{$EXTERNALSYM InterlockedExchangeAdd}
function InterlockedExchangeAdd(var Addend: Longint; Value: Longint): Longint stdcall; overload;
{$EXTERNALSYM InterlockedExchangeAdd}
...
function InterlockedExchangeAdd(Addend: PLongint; Value: Longint): Longint; external kernel32 name 'InterlockedExchangeAdd';
function InterlockedExchangeAdd(var Addend: Longint; Value: Longint): Longint; external kernel32 name 'InterlockedExchangeAdd';
Run Code Online (Sandbox Code Playgroud)
意味着,DLL可以导出具有相同名称的函数.
我试着重复一遍:
我创建了这个项目
Program TestMyDll;
{$APPTYPE CONSOLE}
uses SimpleShareMem, SysUtils;
Function MyFunc(const X:Integer):string; StdCall; External 'MyDll.dll' Name 'MyFunc'; Overload;
Function MyFunc(const X:Extended):string; StdCall; External 'MyDll.dll' Name 'MyFunc'; Overload;
begin
try
Writeln;
Writeln('MyDll test');
Writeln('Int: ' …Run Code Online (Sandbox Code Playgroud) 请注意,sarnold对此问题进行了大量编辑; 原始问题完整地作为评论保留在问题中.如果我做了一些不清楚的事情,也许原来的帖子会有所帮助.(我将其留作评论,因此未来的编辑不需要总是参考问题编辑历史.)
我正在使用Delphi Xe2,需要帮助理解如何正确使用ANSI字符串,Unicode字符串和宽字符串,特别是在编写用于其他语言的DLL(例如VB,C++或C#)时.
我需要使用Delphi Xe2编写DLL来对Unicode字符串执行简单的字符串操作.此DLL需要与一个SimpleShareMem或
ShareMem多个内存管理器一起工作.此DLL需要可以从外部语言(如VB,C++和C#)调用.
默认情况下,字符串现在应该是Unicode字符串.我们应该使用Embarcadero来处理这些字符串吗?
字符串是:(a)不支持Unicode的单字节字符或(b)宽字符串,其中每个字符需要两个字节.(这些支持Unicode,但它们不是UTF-8字符串.)
有两种指针类型可用:PAnsiChar和PWideChar(没有PUnicodeChar指针可用).PChar是别名
PWideChar- 这是否意味着我们总是需要2 * length
为这些字符串分配内存量?(同样,我们需要将内存除以2得到这些字符串的长度吗?)
对于字符串常量,我们是否需要在源代码中标记字符串的类型?例如:
Const MyCo = 'test';
Run Code Online (Sandbox Code Playgroud)
要么
Const MyCo = WideString('test');
Run Code Online (Sandbox Code Playgroud)
当我们在字符串变量之间执行赋值时怎么样?
s := st;
Run Code Online (Sandbox Code Playgroud)
这应该重写:
s := WideString(st);
Run Code Online (Sandbox Code Playgroud)
我们应该在字符串中包含Unicode字节顺序标记吗?我们应该如何在字符串中包含BOM?
我们应该如何使用不同Windows代码页中的ANSI字符串?如果我们收到代码页为1200的ANSI字符串,我们应该重新编码字符串还是按原样使用它?
我们应该如何使用TEncoding类在Unicode,UTF-8,WideString和AnsiString类之间进行转换?
使用宽字符串或Unicode字符串是否有严重的性能损失?
在使用通用内存管理器时,我们是否应该编写接口以仅需要使用WideString变体?
如果我们写的接口需要长度参数PChar,
PAnsiChar以及PWideChar参数类型?
如何编写我们的接口来确定文件是以Unicode,UTF-8,ANSI还是宽字符存储?我们应该如何确定将文件写回时使用的格式?
我们应该只使用程序吗?或者功能也可以吗?
谢谢,新年快乐.

是否可以像Xentient Labels应用程序一样更改Windows资源管理器中项目的背景颜色?是否可以从Windows 7中的Delphi XE2执行此操作?
如何在打开和保存对话框中强制将zip存档显示为文件,而不是文件夹?
显示为文件夹我的意思是这样的:

德尔福Xe.
在delphi中帮助:"...调用此函数通常会重置操作系统错误状态......"
如何在0上重置当前错误?即GetLastError = 0
例:
Try
// There is an error
except
showmessage(inttostr(getlasterror)); // Ok, getlasterror<>0
end;
....
// no errors
....
// How to reset a current error on 0?
showmessage(inttostr(getlasterror)); // Again will be <> 0
Run Code Online (Sandbox Code Playgroud) Win7 x64,Delphi Xe2 update2
提示:
我们编译为x64,它启动ок,按下按钮我们收到错误"在zerro浮动分区".
问题:
ps update3还没有放
pss bad english:on
Delphi Xe,Win7x64
要请求具有已知编号的字符串资源:
Function GuGetStrRes(Fn:string;Nom:integer):string;
var
h:THandle;
buffer:array [0..255] of Char;
begin
Result:='';
if fileexists(Fn)=false then
exit;
Try
h:=LoadLibraryEx(pchar(Fn),0,LOAD_LIBRARY_AS_DATAFILE);
if h=0 then
exit;
if LoadString(h, Nom, buffer, SizeOf(buffer)) > 0 then
Result:=string(buffer);
FreeLibrary(h);
Except
Try
if h<>0 then
FreeLibrary(h);
except
end;
End;
End;
// Use
Showmessage(GuGetStrRes('c:\windows\system32\shell32.dll',4200));
Run Code Online (Sandbox Code Playgroud)
问题:如何在DLL中学习所有"字符串"资源?例如,要接收一个数组:11,22,23,24,40000等等(它们可以不是一个接一个)
试过这样:
...
var
dllname, str:string;
begin
dllname: ='c:\windows\system32\shell32.dll';
str: = ";
For i: = 0 to 10000 do
begin
str: = GuGetStrRes (dllname, i);
if str <> " then
memo1.lines.add (inttostr …Run Code Online (Sandbox Code Playgroud) 德尔福Xe4.例如,有两个函数(Unicode):
CryptAcquireContext,CryptGetProvParam.
我在MSDN上阅读说明:
1)http://msdn.microsoft.com/en-us/library/windows/desktop/aa379886(v=vs.85 ) .aspx
BOOL WINAPI CryptAcquireContext(
_Out_ HCRYPTPROV *phProv,
_In_ LPCTSTR pszContainer,
_In_ LPCTSTR pszProvider,
_In_ DWORD dwProvType,
_In_ DWORD dwFlags);
Run Code Online (Sandbox Code Playgroud)
2)http://msdn.microsoft.com/en-us/library/windows/desktop/aa379929(v=vs.85 ) .aspx
BOOL WINAPI CryptEnumProviders(
_In_ DWORD dwIndex,
_In_ DWORD *pdwReserved,
_In_ DWORD dwFlags,
_Out_ DWORD *pdwProvType,
_Out_ LPTSTR pszProvName,
_Inout_ DWORD *pcbProvName);
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,那么翻译成Delphi应该是这样的:
{S} Function CryptAcquireContext(Out hpProv:PNativeUInt;Const Container:PWideChar;
Const Provider:PWideChar;Const ProvType:DWord;Const Flags:DWord):Bool; StdCall; External Advapi32dll Name 'CryptAcquireContextW';
{S} Function CryptEnumProviders(Const Index:DWord;Const Reserved:PDWord;Const Flags:DWord;
Out ProvType:PDWord;Out pszProvName:DWord;Var pcbProvName:DWord):Bool; StdCall; External Advapi32dll Name 'CryptEnumProvidersW'; …Run Code Online (Sandbox Code Playgroud) delphi ×10
dll ×3
winapi ×3
delphi-xe2 ×2
windows-7 ×2
delphi-xe ×1
delphi-xe4 ×1
dep ×1
overloading ×1
string ×1
vcl-styles ×1