C++ 更改过程名称后找不到MS VS 2010入口点过程
这是一个谜题,我在SO或其他网站上找不到答案。我是个新手,但我正在努力快速学习 我需要从更改dll入口点过程的名称C++ 更改过程名称后找不到MS VS 2010入口点过程,c++,dll,unmanaged,visual-c++-2010,entry-point,C++,Dll,Unmanaged,Visual C++ 2010,Entry Point,这是一个谜题,我在SO或其他网站上找不到答案。我是个新手,但我正在努力快速学习 我需要从更改dll入口点过程的名称 int subCreatePipe() 到 但当我这么做的时候,发射程序就死了 具体错误是: 在动态链接库myPipe.dll中找不到过程入口点subCreateNewPipe 我正在运行的设置有: 视窗7 微软Visual Studio 2010 C++ Win32 非托管无CLI MBCS 我使用上述设置创建了myPipe.dll,以测试我创建dll和打开管道的能力。 我使用
int subCreatePipe()
到
但当我这么做的时候,发射程序就死了
具体错误是:
在动态链接库myPipe.dll中找不到过程入口点subCreateNewPipe
我正在运行的设置有:
视窗7
微软Visual Studio 2010
C++ Win32
非托管无CLI
MBCS
我使用上述设置创建了myPipe.dll,以测试我创建dll和打开管道的能力。
我使用上述设置创建了一个TestPipe.cpp,但是使用了Win32控制台,所以我可以运行一个程序,该程序将链接到dll并为我显示一些结果。
我还有另一个程序,它将向管道发送一些信息。
现在是踢球者:
我用一个名为int subCreatePipe的过程创建了dll。
我成功地编译了它。
我将发布文件移动到我的TestPipe项目库子文件夹中。
在TestPipe.cpp中,我有一行代码要调用该过程:
x = subCreatePipe();
我编译了TestPipe.cpp并运行了TestPipe.exe版本,它运行得非常完美。
它查找subCreatePipe的入口点
但我需要将DLL过程重命名为subCreateNewPipe,以遵守我无法控制的命名约定
我将myPipe.dll中的过程重命名为int subCreateNewPipe
我成功地编译了它。
我将发布文件移动到我的TestPipe项目库子文件夹中。删除旧文件
在TestPipe.cpp中,我将对过程的调用更改为:
x = subCreateNewPipe();
我编译TestPipe.cpp并运行发行版TestPipe.exe,它会随着上面给出的错误而消失
如果我返回并将DLL过程名称更改为subCreatePipe,它将再次运行。如果我返回并将其更改为subCreateNewPipe,它将再次死亡。我所做的唯一不同的事情是更改入口点过程名称
因此,我的问题是:
在VS 2010中有没有办法重命名入口点过程?
我应该使用DLLMain吗,即使我只是将它留空?这种形式似乎不好。
有什么隐藏的开关我不见了吗?
链接器到底是怎么回事?
有没有名字弄乱了?
或者,在你第一次编译一个项目之后,还有什么是不能更改的吗?
我还尝试了一些其他方法,第一种方法仍然有效,但第二种方法失败:
我试过使用stdcall
我试过使用declspecdllexport
我还尝试使用.DEF文件定义链接器的过程名称
int subCreatePipe() // works
int subCreateNewPipe() // doesn't work
在所有示例中,我更改TestPipe.cpp代码以调用正确的过程名称
如果你说不出来的话,我有点强迫症,想办法让它发挥作用
我现在要创建一个新的Win32控制台应用程序来调用dll,这是我24小时前应该做的。然而,我仍然很好奇为什么我不能更改入口点过程的名称。如果您能深入了解为什么不能这样做,更好的编码技术,或者如何解决这个链接器问题,我们将不胜感激。解决方案:
在非托管C++中,DLL的清理不会像托管C++那样清除发布文件夹。每次更改DLL时,必须将新DLL物理移动到应用程序的“发布”文件夹中
<>我学会了如何处理托管C++中的DLL更新,其中在应用程序文件夹中所要做的就是清除旧DLL库子文件夹,并将更改后的DLL的新版本复制到该空库子文件夹中。当您清理并重建调用DLL的应用程序时,托管VS2010 C++将删除旧DLL的发布文件夹,并将新DLL从库子文件夹复制到应用程序发布文件夹中。它很好地保持您的DLL的最新
在非托管C++中,清理和重建不会删除旧DLL,而不是从应用程序的发布文件夹中删除。而且它也不会从库子文件夹复制新的DLL。因此,尽管我认为我把我的新DLL放在一个文件夹中,我的程序可以找到它们,但是它们没有被复制,就像它们在托管C++下一样。 当Michael Burr给我link/dump/exports myPipe.dll工具时,我能够看到dll的时间戳和可用的过程。在我的例子中,这是第一个只有一个过程的DLL构建。很明显,这是一个旧的DLL,而不是当前的
这解释了为什么应用程序总是使用旧的过程名称运行。但是,当使用新过程名编译时,它会给出一个过程入口点错误,因为应用程序只能找到新过程名不存在的旧DLL再次感谢!: 如果我能理解你的问题,你就不应该用dll E这个词
这是一个非对称点程序。DLL入口点是加载程序在加载DLL时调用的,是一个非常高级的设置,很少需要修改。您所谈论的似乎是从应用程序调用的DLL导出。听起来应用程序正在查找旧的DLL构建。确保更新的DLL位于应用程序将从中加载它的位置。嗨,迈克尔:感谢您的响应。我收到的错误消息是…过程入口点…,这就是我在描述中使用它的原因。我不接触dll入口点的配置->链接器->高级选项。该设置仍为空。而且我同意这听起来像是一个旧的DLL可能是问题。但事实并非如此。我每次都会清除我的dll库文件夹,并复制新的dll发布文件。当我编译了原始过程名时。。。它起作用了。当我尝试更改原始过程名称时,它不起作用。。。我知道。。。这也让我感到困惑。在入门术语上,这是很公平的。您可以尝试以下操作并将结果粘贴到您的问题中:link/dump/exports myPipe.dll | grep subCreate和link/dump/imports application.exe | grep subCreate在适当的情况下替换正确的文件名。谢谢Michael:查看dll详细信息的工具非常有用。他们帮了我很大的忙,帮了我解决问题。我将编辑我的上述帖子,详细说明我错过解决方案的原因。再次感谢你对我的耐心和分享这些工具!
int __stdcall subCreatePipe() // works
int __stdcall subCreateNewPipe() // doesn't work
ifdef X_EXPORT_FLAG
#define DLL_IMPORT_EXPORT __declspec(dllexport)
else
#define DLL_IMPORT_EXPORT __declspec(dllimport)
endif
X_EXPORT_FLAG int __stdcall subCreatePipe() // works
X_EXPORT_FLAG int __stdcall subCreateNewPipe() // doesn't work
int subCreatePipe() // works
int subCreateNewPipe() // doesn't work