C++ 更改过程名称后找不到MS VS 2010入口点过程

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和打开管道的能力。 我使用

这是一个谜题,我在SO或其他网站上找不到答案。我是个新手,但我正在努力快速学习

我需要从更改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