第一次编译成功,第二次编译出错问题。是否是c++builder,delphi的bug?(LPITEMIDLIST pidl)(100分)

  • 主题发起人 主题发起人 yjbin
  • 开始时间 开始时间
Y

yjbin

Unregistered / Unconfirmed
GUEST, unregistred user!
为什么在程序中定义了 ;LPITEMIDLIST pidl; 后,第一次编辑后能执行。但修改后第二次编辑就出错,显示:[C++ Error] Unit1.h(622): E2451 Undefined symbol 'LPITEMIDLIST'
(1)在关闭所有文件,(2)再把编译中产生的垃圾文件(*.tds,*.obj)等都删除后,(3)再打开工程项目文件编译,竟又正常了。
现在的问题是,每当我修改一些代码编译后,都必须执行(1),(2),(3)步,太麻烦了,
我用的是C++ Builder5.0 Enterprise Version + Patch1.
谁知如何此问题解决?

代码段如下,功能是把文件放到桌面上:
#define NO_WIN32_LEAN_AND_MEAN

void __fastcall CreateFilesOnDesktop(AnsiString TotalFileName,AnsiString FileName)
{
; LPITEMIDLIST pidl;
; LPMALLOC pShellMalloc;
; char szDir[MAX_PATH];
; AnsiString DesktopDir;

; if(SUCCEEDED(SHGetMalloc(&pShellMalloc)))
;{
; ; //桌面CSIDL_DESKTOPDIRECTORY
; ; //启动目录CSIDL_STARTUP
; ; ;if(SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOPDIRECTORY,&pidl)))
; ; {
; ; ; ;// 如果成功返回true
 
将#include <shlobj.h>放在#define NO_WIN32_LEAN_AND_MEAN之后,#include <vcl.h>之前,这样:
#define NO_WIN32_LEAN_AND_MEAN
#include <shlobj.h>
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
......

再有,是否静态编译了(就是把*.bpl编译进你自己的程序里了)

你再新建一个工程,只把 ;LPITEMIDLIST pidl; 和相应的头文件写进去,看看是否还会出这事?!

上面是一家之言,不一定对,你试试看
 
多谢,改了几次再编译,好像没问题了。
我在程序中没放 #include <shlobj.h> 语句,为什么
有时候找得到LPITEMIDLIST的定义,有时候找不到?看来borland的纊译器小bug不断啊。
还有编译后只遇到一个常见的小告警:
[C++ Warning] UNIT1.H(372): W8058 Cannot create pre-compiled header: initialized data in header

双击告警时指向unit1.h中语句1:
......
TMyThread *CheckUrlThread; //1.
extern PACKAGE TForm1 *Form1;
.......
前段时间还没这个问题,后来程序越编越大,只顾忙着解决其它的大Error了,今天注意到了这个小问题,却没法解决,请教大家解决这个告警有没有什么经验?


我也看了在线帮助的几种可能,似乎都没错。
1。code in header One of the headers contained a non-inline function body.
2。initialized data in header One of the headers contained a global variable definition (in C, a global variable with an initializer; in C++ any variable not declared as 'extern').

3。header incomplete The pre-compiled header ended in the middle of a declaration, for example, inside a class definition (this often happens when there is a missing"}" in a header file).
 
>>我在程序中没放 #include <shlobj.h> 语句,为什么
>>有时候找得到LPITEMIDLIST的定义,有时候找不到?看来borland的纊译器小bug不断啊。
我看到你的程序中有#define NO_WIN32_LEAN_AND_MEAN,马上就意识到可能与shlobj.h文件有关,
因为在C++Builder5的Update1升级包中明确指出SHLOBJ.H和SHLOBJ.HPP中存在着多重定义的情况,
解决方法就是在开头加上#define NO_WIN32_LEAN_AND_MEAN,然后,我又查了一下,LPITEMIDLIST
果然是在SHLOBJ.H中定义的,所以,提到了#include <shlobj.h>,即便不用,也肯定是别的什么
库文件中间接地包含了shlobj.h,具体是哪个,你自己查一下吧。
Delphi和C++Builder都有Bug,但这里不是。

>>还有编译后只遇到一个常见的小告警:
>>[C++ Warning] UNIT1.H(372): W8058 Cannot create pre-compiled header: initialized data in header
这个警告我也遇到过,我总认为这是编译器优化代码产生的结果,可以不管它
 
后退
顶部