小弟昨天刚学delphi,遇到很多简单的语法问题,不大懂,请各位哥哥姐姐多多指教,谢谢了先。
1、怎样在string和CHAR*间转换??如使用lstrcpy之类的函数的时候(我用了一个强行转换的办法,但好象不太对)
2、以下代码老是说我什么参数有错的有错,请问是何原因?
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ComCtrls,Tlhelp32;
//....中间代码略
procedure TFormMain.BitBtnUpdateWindowClick(Sender: TObject);
var
  hCurrentHwnd:HWND;
  hModuleSnap:Cardinal;
  peId:DWORD;
  FilePath:string;
  me32:MODULEENTRY32;
  TempString:string;
begin
  hCurrentHwnd:=GetForegroundWindow;
  GetWindowThreadProcessId(hCurrentHwnd,@peId);
  hModuleSnap:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,peID);
  if(hModuleSnap<>INVALID_HANDLE_VALUE) then
  begin
    ZeroMemory(@me32,sizeof( MODULEENTRY32));
    me32.dwSize:=sizeof( MODULEENTRY32);    if(Module32First(hModuleSnap,@me32)=1) then
    begin
      repeat
        TempString:=me32.szExePath;
        if(Pos('.exe',TempString)>0) then
        begin          lstrcpy(PAnsiChar(FilePath),me32.szExePath);
          break;
        end
      until (Module32Next(hModuleSnap,@me32)=0)    end
  endend;
错误提示在
    if(Module32First(hModuleSnap,@me32)=1) then
和      until (Module32Next(hModuleSnap,@me32)=0)
这两行,错误为:
[Error] UnitMain.pas(48): Types of actual and formal var parameters must be identical3、如何在双字节字符传与ansi字符串之间转换?

解决方案 »

  1.   

    没有看到Module32First和Module32Next的原型不敢肯定,估计改为
    if(Module32First(hModuleSnap,me32)=1) then
    和      until (Module32Next(hModuleSnap,me32)=0)
    就可以了,me32对应的形参已经声明为传址调用,所以不需要显示传递一个指针过去。
      

  2.   

    我觉得你可以看看delphi的帮助
      

  3.   

    我用VC的时候,MODULEENTRY32这个参数是必须为指针的,应该delphi里面不会有太大改变吧?很多WINDOWS类型在delphi里好象都用不了,c运行期库也不能用了,:(
      

  4.   

    我查了delphi本身的声明,应该我没有写错啊
    {$EXTERNALSYM Module32First}
    function Module32First(hSnapshot: THandle; var lpme: TModuleEntry32): BOOL;
    {$EXTERNALSYM Module32Next}
    function Module32Next(hSnapshot: THandle; var lpme: TModuleEntry32): BOOL;type
      TModule32First = function (hSnapshot: THandle; var lpme: TModuleEntry32): BOOL stdcall;
      TModule32Next = function (hSnapshot: THandle; var lpme: TModuleEntry32): BOOL stdcall;
    请各位大侠帮小弟看看啊,谢谢了先
      

  5.   

    MODULEENTRY32本来就是一个指针了
      

  6.   

    楼主 delphi跟vc差很多的 我现在也是两个都用不过你先要搞清楚delphi的基本语法你是要调用vc写的dll么?? 动态调用?
      

  7.   

    Module32First(hModuleSnap,me32);这样是可以通过的
      

  8.   

    以下是我的全部代码,请各位哥哥不妨编译一下,环境D7,反正我通不过,谢谢了先(是个FORM,dll我一般都用VC^_^,语法昨天大致看了一下,应该不会有什么问题,我一边查delphi帮助一边写的,大致上应该还没有什么语法错误,呵呵)
    unit UnitMain;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons, ComCtrls,Tlhelp32;type
      TFormMain = class(TForm)
        PageControlMain: TPageControl;
        TabSheetWindowsControl: TTabSheet;
        ListView1: TListView;
        TabSheetProcessContrl: TTabSheet;
        ListView2: TListView;
        BitBtnUpdateWindow: TBitBtn;
        procedure BitBtnUpdateWindowClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      FormMain: TFormMain;implementation{$R *.dfm}procedure TFormMain.BitBtnUpdateWindowClick(Sender: TObject);
    var
      hCurrentHwnd:HWND;
      hModuleSnap:Cardinal;
      peId:DWORD;
      FilePath:string;
      me32:TModuleEntry32;
      TempString:string;
    begin
      hCurrentHwnd:=GetForegroundWindow;
      GetWindowThreadProcessId(hCurrentHwnd,@peId);
      hModuleSnap:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,peID);
      if(hModuleSnap<>INVALID_HANDLE_VALUE) then
      begin
        ZeroMemory(@me32,sizeof( MODULEENTRY32));
        me32.dwSize:=sizeof( MODULEENTRY32);
      //  pme32:=@me32;
        if(Tlhelp32.TModule32First(hModuleSnap,me32)=1) then
        begin
          repeat
            TempString:=me32.szExePath;
            if(Pos('.exe',TempString)>0) then
            begin          lstrcpy(PAnsiChar(FilePath),me32.szExePath);
              break;
            end
          until (Module32Next(hModuleSnap,me32)=0)    end
      endend;end.
      

  9.   

    1.String,PChar;你可以使用@string[1],或者PChar(string),strpas(PChar);
    或者Move(@string[1],Pchar,len);CopyMemory,strcopy等等
    2.就按上面說的應該沒錯
    if(Module32First(hModuleSnap,me32)=1) then
     until (Module32Next(hModuleSnap,me32)=0)
    3.如果你只是簡單使用Unicode和Ansi,
    你可以分開定義widestring和string.
    你也可以轉換,當然API可以.Delphi中自己的函數我還不清楚.不過可以在string,widestring好像直接符值(沒直接測試過.我只用過參數傳遞,Format函數可以);對Delphi不是很熟悉,都是出現錯誤再更改或者查資料的
      

  10.   

    解决了,是语法问题,唉,delphi果然和VC不一样