_tWinMain问题????

xuxian02092213 2008-11-01 10:20:36
在《Windows核心编程第五版》20章中有延迟加载DLL 的源代码实例,但是我在VS2005下创建了WIN32应用程序,添加连接器开关,编译的时候就出现了问题(DLL模块没有出现问题),问题如下:错误 1 error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用 MSVCRTD.lib

但是添加上了#pragma comment (linker,"/subsystem:windows") 之后,编译出现了:错误 1 error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用 MSVCRTD.lib

代码部分如下:
TCHAR SName[]=TEXT("DLL");

LONG WINAPI DelayLoadException(PEXCEPTION_POINTERS pep);

void IsModuleLoaded(PCTSTR hInst)
{
HMODULE hmod=GetModuleHandle(hInst);

char sz[100];
#ifdef UNICODE
StringCchPrintfA(sz,_countof(sz),"Module\"%S\" is %S Loaded",hInst,(hmod==NULL)? L"not ":L" ");
#else
StringCchPrintfA(sz,_countof(sz),"Module\"%s\" is %s Loaded",hInst,(hmod==NULL)? L"not ":L" ");
#endif
chMB(sz);
}


将代码的main部分改为 void main()的时候就都可以了,这个是为什么呢,还请给为仁兄帮帮忙
...全文
317 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jia_xiaoxin 2008-11-01
  • 打赏
  • 举报
回复
将代码的main部分改为 void main()的时候就都可以了
可见你的应用程序还是console应用程序

对于
但是添加上了#pragma comment (linker,"/subsystem:windows") 之后,编译出现了:错误 1 error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用 MSVCRTD.lib
可以这样试一下:

1.菜单中选择 Project->Properties, 弹出Property Pages窗口

2.在左边栏中依次选择:Configuration Properties->C/C++->Preprocessor,然后在右边栏的Preprocessor Definitions对应的项中删除_CONSOLE, 添加_WINDOWS.

3.在左边栏中依次选择:Configuration Properties->Linker->System,然后在右边栏的SubSystem对应的项改为Windows(/SUBSYSTEM:WINDOWS)

xuxian02092213 2008-11-01
  • 打赏
  • 举报
回复
知道问题所在了
sys0004 2008-11-01
  • 打赏
  • 举报
回复
你把_tWinMain中的代码到注释掉有问题没?
xuxian02092213 2008-11-01
  • 打赏
  • 举报
回复
源代码的主函数是这样子的:
int WINAPI _tWinMain(HINSTANCE hInstance,HINSTANCE ,PTSTR pszCmdLine,int)
{
__try{
int x=0;
IsModuleLoaded(SName);

x=fnLib();
.........


使用_tWinMain就会出现上面的问题!
MilanSpiRiT 2008-11-01
  • 打赏
  • 举报
回复
恩,这个链接错误应该是由于工程类型建错了导致的~~

同意楼上,用_T宏做UNICODE编码比较好
sys0004 2008-11-01
  • 打赏
  • 举报
回复

char sz[100];
#ifdef UNICODE
StringCchPrintfA(sz,_countof(sz),"Module\"%S\" is %S Loaded",hInst,(hmod==NULL)? L"not ":L" ");
#else
StringCchPrintfA(sz,_countof(sz),"Module\"%s\" is %s Loaded",hInst,(hmod==NULL)? L"not ":L" ");
#endif

正确的编程风格应该是这样的:


TCHAR sz[100] = { 0 };
StringCchPrintf(sz, _countof(sz), _T("Module\"%s\" is %s Loaded"), hInst, (hmod==NULL)? _T("not ") : _T(L" "));
帅得不敢出门 2008-11-01
  • 打赏
  • 举报
回复
应该是工程类型要匹配吧
sys0004 2008-11-01
  • 打赏
  • 举报
回复
应该是你的工程设置问题,把Win32 Application建成了Win32 console了。

重新用向导生成个Win32 Application程序。
帅得不敢出门 2008-11-01
  • 打赏
  • 举报
回复
将代码的main部分改为 void main()的时候就都可以了
什么意思 ????

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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