我用如下代码修改一DLL中序列号为1的字符串内容:======================================================== Tempstr:string; SetLength(Tempstr,255); TempStr:='abcded'; UpdateResource(hUpdateRes,
            RT_STRING,
            MAKEINTRESOURCE(1),
            MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),
            @TempStr,
            Length(TempStr)); =========================================================可是执行后,字符串内容变成了空,查了一些资料,都是讲RT_RCDATA方面的,修改RT_STRING方面的特少,有人说调用该API时,应将传给它的字符串转为Unicode格式,我试了,还是不行,请高手指点该如何解决,谢谢!

解决方案 »

  1.   

    在使用UpdateResource前先调用BeginUpdateResource试试
      

  2.   

    to naughtyboy: 我贴的是程序片段,BeginUpdateResource和EndUpdateResource都用了,而且修改别的数据类型均已成功,只是在RT_STRING中碰到问题,呵呵,还是说正题吧! :)
      

  3.   

    函数功能:该函数增加,删除,或替代某可执行文件中的资源。    函数原型:BOOL UPdateResource(HANDLE hUpdate,LPCTSTR lPTyPe,LPCTSTR IPName,WORD wLanguage,LPVOID lgData,DWORD cbData);    参数:    hUpdate:指定更新文件句柄。此句柄由BeginUpdateResource函数返回。    lpType:指向说明将被更新的资源类型的字符串,它以NULL为终止符。这个参数可以是一个通过宏MAKENTRESOURCE传递的整数值,含义参见EnumResLangProc\lpType。    lpName:指向说明待被更新的资源名称的字符串,它以NULL为终止符。这个参数可以是一个通过宏MAKEINTRESOURCE传递的整数值。    wLanguage:指定将被更新资源的语言标识。要了解基本的语言标识符以及由这些标识符组成的字语言标识符的列表,可参见宏MAKELANGID。    lpData:指向被插入可执行文件的资源数据的指针。如果资源是预定义类型值之一,那么数据必须是有效且适当排列的。注意这是存储在可执行文件中原始的一进制数据,而不是由Loadlcon,LoadString或其他装载特殊资源函数提供的数据。所有包含字符串、文本的数据必须是Unicode格式;IpData不能指向ANSI数据。    如果lpData为NULL,所指定的资源将从可执行文件中被删除。    cbData:指定lpData中的资源数据数据大小,以字节计数。    返回值:如果函数运行成功,返回值为非零;如果函数运行失败,返回值为零。若想获得更多的错误信息,请调用GetLastError函数。    注意:应用程序重复使用UpdateResource去改变资源数据。每次UpdateResource调用都要占用系统内部的一个增加、删除、替代的列表,而实际上并没有将数据写到可执行文件中。应用程序必须通过使用EndUpdateResource函数将每次积累的变化写入可执行文件中。    速查:Windows NT 3.1以上,头文件:winbase.h;库文件:kerne132.lib;Unicode:在Windows NT上实现为Unicode和ANSI两种版本。
      

  4.   

    新改写的代码如下:procedure TForm1.Button2Click(Sender: TObject);
    var
      hUpdateRes:THandle;
      Getresult:Boolean;
      pStr:PWidechar;
      tmpStr:string;
    begin tmpStr:='internet';
     GetMem(pStr,Sizeof(widechar)*Length(tmpStr));
     if pStr<>nil then
       StringToWideChar(tmpStr,pStr,Sizeof(widechar)*Length(tmpStr)); hUpdateRes := BeginUpdateResource('c:\abc\project1.dll', False);
     if (hUpdateRes =0 ) then Showmessage('Could not open file for writing.');
     Getresult:=UpdateResource(hUpdateRes,
                RT_STRING,
                MAKEINTRESOURCE(1),
                MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),
                pStr,
                Sizeof(widechar)*Length(tmpStr)
                ); if (Getresult=False) then Showmessage('Could not add resource.');
     if ( Not EndUpdateResource(hUpdateRes, False)) then Showmessage('Could not write changes to file.'); FreeMem(pStr,Sizeof(widechar)*Length(tmpStr));end;=================================================================
    以上代码经过跟踪,将ansi-string转为unicode是成功的,UpdateResource执行也通过,但序号为1的字符串的值写的还是不对,请高手给看看,我感觉离成功又近一步了  :)
      

  5.   

    这个问题真的很难吗?我在CSDN和Delphibbs.com上发了两个贴都没有人回 :(