调用api的问题

亲密数 2003-11-05 12:32:33
我把一个c++编写的程序改成delphi的,在调用api的时候出现问题
GetClassName(hWnd,ClassName,MAX_PATH);//得到窗口类名
GetWindowText(hWnd,TitleName,MAX_PATH);//得到窗口的标题名
执行完这两个函数,ClassName,TitleName用showMessage()显示是乱码,谁能知道一下,非常感谢.其中ClassName,TitleName:array[0..MAX_PATH-1] OF CHAR;
...全文
86 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
karach 2003-11-05
  • 打赏
  • 举报
回复
我看不出什么问题,是不是其他地方的问题
lvloj 2003-11-05
  • 打赏
  • 举报
回复
function GetClassNameFromHandle(const hWnd: HWND): string;
var
ClassName: string;
begin
SetLength(ClassName, 255);
GetClassName(hWnd, PChar(ClassName), 255);
Result := StrPas(PChar(ClassName));
end;
aiirii 2003-11-05
  • 打赏
  • 举报
回复
感覺不出問題啊, 那你可在 GET前,用
ZeroMemory試試!!

在我的程序我再測試下, 正常顯示:
procedure TForm1.Button1Click(Sender: TObject);
var ClassName,TitleName:array[0..MAX_PATH-1] OF CHAR;
begin
GetClassName(handle,ClassName,MAX_PATH);
showmessage(StrPas(className));
end;
亲密数 2003-11-05
  • 打赏
  • 举报
回复
感谢大家,我找到问题出在那里了。我把 EnumWndProc的声明后面加上 stdcall,然后就没有这个问题了。与调api函数没有关系,EnumWindowProc函数是要由EnumWindows函数来调用的。我只知道加上 stdcall问题解决了,但不知道是什么原因
naughtyboy 2003-11-05
  • 打赏
  • 举报
回复
GetClassName(hWnd,@ClassName,MAX_PATH);//得到窗口类名
GetWindowText(hWnd,@TitleName,MAX_PATH);//得到窗口的标题名
亲密数 2003-11-05
  • 打赏
  • 举报
回复
//这是源代码,有问题的地方在FindChildWnd( hwnd:HWND;classTree,titleTree:pchar);里
//整个程序是用来枚举窗口树,和标题树的,盼指点

unit UEnumWindow;

interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, UDealCommonProcess;

const
MAX_PROCESS_COUNT = 100;
MAX_WND_COUNT = 1024;

Type
TProcessPhoto = TProcessInfo;
TProcessPhotoArray = array[0..MAX_PROCESS_COUNT] OF TProcessPhoto;
TWindowsPhoto = record
hWnd:HWND;
TitleTree,classTree:TszFileName;
end;
TWindowsPhotoArray = array[0..MAX_WND_COUNT] OF TWindowsPhoto;

function ListProcess():integer;
function GetProcPathByWnd( hwnd:HWND;var path:Pchar):DWORD;
procedure FindChildWnd( hwnd:HWND;classTree,titleTree:pchar);
function EnumWndProc(hwnd:HWND;lParam:LPARAM): BOOL; //call back function

var
gIdxProcPhoto :integer = 0; //当前进程快照索引
gIdxWindPhoto :integer = 0; //当前窗口快照索引
gProcPhoto:TProcessPhotoArray; //当前进程快照
gWindPhoto:TWindowsPhotoArray; //当前窗口快照

implementation

//得到当前系统的进程快照
function ListProcess():integer;
begin
showMessage('listProcess()');//debug
gIdxProcPhoto := QueryProcessInfo( gProcPhoto,MAX_PROCESS_COUNT );
result := gIdxProcPhoto;
end;

//得到指定窗口进程与pid
function GetProcPathByWnd( hwnd:HWND;var path:Pchar):DWORD;
var
pid : dword;
i : integer;
begin
showMessage('GetProcPathByWnd'+intToStr(hwnd) );//debug
pid := 0;
GetWindowThreadProcessId( hwnd,pid );
showMessage( intToStr(pid) +path);//debug
for i:=0 to gIdxProcPhoto-1 do
begin
if (pid = gProcPhoto[i].pid) then
begin
strcopy(path,gProcPhoto[i].path);
result := pid;
exit;
end;
end;
result := pid;
end;

//枚举子窗口过程
procedure FindChildWnd( hwnd:HWND;classTree,titleTree:pchar);
var
hChildWnd:cardinal;
newClassTree,className,
newTitleTree,titleName:array[0..MAX_PATH-1] OF CHAR;

begin
//showMessage('findChildWnd'+intToStr(hwnd) );//debug
if ( strLen(classTree) > MAX_PATH - 40 ) then exit;
if ( strLen(titleTree) > MAX_PATH - 40 ) then exit;
if ( gIdxWindPhoto >= MAX_WND_COUNT ) then exit;


GetClassName( hwnd,ClassName,MAX_PATH);
GetWindowText( hwnd,TitleName,MAX_PATH );
showMessage(StrPas(ClassName));//debug
StrCat( newClassTree, classTree);
StrCat( newClassTree, '\\' );
StrCat( newClassTree, ClassName);

StrCat( newTitleTree, titleTree );
StrCat( newTitleTree, '\\' );
StrCat( newTitleTree, titleName );
{StrLFmt(@newClassTree,MAX_PATH,'%s\\%.40s',[@classTree,@className]);
StrLFmt(@newTitleTree,MAX_PATH,'%s\\%.40s',[@titleTree,@titleName]);}
//@newClassTree := PChar(String(@classTree) + '\\'+ String(@className));
//newTitleTree := @titleTree + '\\'+ @titleName;
hChildWnd := GetWindow( hwnd,GW_CHILD );
if ( hChildWnd<>0 ) then
begin
repeat
FindChildWnd( hChildWnd,newClassTree,newTitleTree);
hChildWnd := GetWindow( hChildWnd,GW_HWNDNEXT);
until hChildWnd = 0;
end
else //纪录最深层次的Tree
begin
if ( gIdxWindPhoto <> 0 )
and ( Stricomp( gwindPhoto[gIdxWindPhoto-1].classTree, newClassTree) = 0)
and ( Stricomp( gwindPhoto[gIdxWindPhoto-1].TitleTree, newTitleTree ) =0 ) then
begin
exit;
end;
gWindPhoto[gIdxWindPhoto].hWnd := hWnd;
strcopy( gWindPhoto[gIdxWindPhoto].classTree,newClassTree) ;
strCopy( gWindPhoto[gIdxWindPhoto].titleTree,newTitleTree) ;
inc(gIdxWindPhoto);
end;
end;

function EnumWndProc(hwnd:HWND;lParam:LPARAM): BOOL; //call back function
VAR
ClassName:array[0..MAX_PATH-1] of char;
begin
//showMessage('EnumWndProc'+intTostr(hwnd) );//debug
//zeromemory(@ClassName,MAX_PATH);
//GetClassName( hwnd,ClassName,MAX_PATH);
//showMessage( 'in enumWndProc'+ClassName );//debug
FindChildWnd( hwnd,pchar(''),pchar(''));
result := true;
end;

end.
本次更新内容主要是BUG修复和功能改进,相隔4个月又发布了新版本,这次更新更像是例行公事,不过好在修复了很多BUG,另外需要说一下,EasyUI框架当中其实官方还隐藏了不少API没有开放出来,有些朋友建议我把整理一下,将一些好用的API及其用法也更新到中文API中,这里我想说的是,有些API或许是因为不稳定、尚有BUG、未完全实现或者是未经过完整测试的,所以官方并未公布出来,因此我也不建议大家大面积的去使用,这样会带来很多不稳定因素,甚至是致命的BUG,这也是我没有将这些API写入中文API文档的原因,所以有能力并且需要的人就自行去源代码中挖掘吧,我这里只同步官网的API(外加少许的变动或者不影响稳定性和安全性的新增内容)。 jQuery EasyUI 1.4.4版本更新内容: Bug(修复) filebox:修复“clear”和“reset”方法在IE9下无法正常工作的问题; messager:修复调用无参的$.messager.progress()方法之后,再调用$.messager.progress('close')方法时无法正常工作的问题; timespinner:修复在IE8中点击微调按钮时无法正确显示值的问题; window:修复在“onMove”事件中调用“options”方法时无法正常显示的问题; treegrid:修复“getLevel”方法无法接受为0的参数值的问题。 Improvement(改进) layout:改进后的“collapsedContent”、“expandMode”和“hideExpandTool”属性可以支持区域面板; layout:改进后的“hideCollapsedContent”属性可以在折叠面板上设置显示垂直标题栏; layout:新增“onCollapse”、“onExpand”、“onAdd”、“onRemove”事件; datagrid:在排序列的标题上显示↑↓图标; datagrid:新增“gotoPage”方法; propertygrid:新增“groups”方法,以允许获取所有数据租; messager:在显示长消息的的时候支持对消息进行自动滚动; tabs:“disabled”属性支持定义一个被禁用的选项卡面板; tabs:支持百分比大小。

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧