Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 德尔福:不';除非安装Visual C++;2008年可再发行_C++_Delphi_Dll - Fatal编程技术网

C++ 德尔福:不';除非安装Visual C++;2008年可再发行

C++ 德尔福:不';除非安装Visual C++;2008年可再发行,c++,delphi,dll,C++,Delphi,Dll,我的应用程序中加载了一个DLL,如下所示: procedure LoadTessDLL; var DLLHandle: THandle; begin DLLHandle := LoadLibrary(PChar(ExtractFilePath(application.exename) + 'tessdll.dll')); if DLLHandle >= 32 then begin TessDLLLoaded := True; 我们发现,在XP PC上使用Servi

我的应用程序中加载了一个DLL,如下所示:

procedure LoadTessDLL;
var
  DLLHandle: THandle;
begin
  DLLHandle := LoadLibrary(PChar(ExtractFilePath(application.exename) + 'tessdll.dll'));
  if DLLHandle >= 32 then
  begin
    TessDLLLoaded := True;

我们发现,在XP PC上使用Service PACK 2,DLL无法加载(DLRACH=0等),除非我们安装微软Visual C++ 2008可重新分配。然后它被加载,工作正常


你能帮我在没有它的情况下让它工作吗?

你控制源DLL吗?如果不是,那么,DLL依赖于C++ 2008运行时,它必须安装用于DLL运行,并且您需要将其添加为安装的一部分。

如果您确实控制DLL的源代码,那么将其静态链接到C++运行时,它将运行库构建到DLL中。


此问题与Windows XP无关。DLL需要Vista上的C++ 2008运行时,7也需要,您所测试的机器已经安装了。C++运行时不保证安装在任何版本的Windows上。

< P>如果DLL需要VS2008可重新分配,则需要它,并且应该将可重新分配的部分作为产品安装程序的一部分。 Microsoft提供打包的可再发行软件包,以便包含在其他安装程序中,并打算以这种方式使用。(它将为您的安装程序添加一到两兆字节。)

除非您有DLL的源代码,并且可以重新编译它以静态链接C运行时,否则无法绕过此问题


(即使您有源代码,简单地使用静态链接重新编译也可能会引入错误。DLL可能假定它与其他模块共享同一堆)在这个过程中,只有动态链接到同一个C运行时DLL才是这样。精心设计的DLL避免了这样的假设,但是你需要仔细检查DLL写的方式是否正确。)/P> < P>嗯,我最好的猜测是你的TestDL.DLL需要VisualC++分发的DLL。如果找不到给定的DLL,则无法加载

如果我在这一点上是对的,那么它在没有它的情况下工作的唯一方法是,如果您有源代码来创建desdll.DLL并删除对Visual C++的DLL的所有依赖项


一个开始调试它的好地方是在它实际工作的工作站上。制作一个加载DLL的小测试程序。在调试器中运行它,查看加载DLL时加载的是其他DLL。如果你幸运的话,PROBEM可以在一个OS文件的版本中,MSVC可重新分发的时候会发生更新。

< P>安装VisualC++之前,我假设你在DLL上有一个地方,安装VC可能会在你的环境路径中放置另一个DLL拷贝。 您是否尝试过将tessdll.dll放在搜索路径中包含的位置?比如说System32,或者在运行可执行文件的同一目录中?我不熟悉Delphi,因此我猜测ExtractFilePath的逻辑,您有以下选项:

  • 编译DLL而不需要运行时,但是如果使用VC++2008编写的多个DLL需要共享运行时,请注意问题
  • 安装VC++2008可再发行版本,它将安装一个系统范围的可用运行时

  • 将所需的VC+2008运行时DLL安装在与所需DLL相同的路径中,从而获得该DLL的“私有”副本 请参见此处:

    “tessdll.dll”。那不是OCR软件中的DLL吗?Windows版本是用Visual C++ 6编译的,因此需要那些运行库。您的版本似乎是用VC++2008编译的。
    如果您有RAD Studio版本,那么您可以使用C++Builder下载并重新编译它,尽管这可能需要一些调整。有关该代码的更多信息似乎也可以获得。

    Richard,很久很久以前(16位API)测试“32”的返回是正确的。针对“0”(NULL)进行测试。若要澄清。。。0表示未加载,>0表示已加载?刚刚构建了tesseract ocr二进制文件,静态链接所有RTL@user205376哈哈,说起来容易做起来难。我是一名Delphi开发人员,虽然我可以访问源代码,但我不知道如何执行您刚才所说的操作-我只得到了DLL文件,而且我还看到了一个.lib文件,到目前为止我还没有包括在内。现在,我将尝试使用同一文件夹中的.lib文件进行测试,看看会发生什么。可能很难……事实上,我说的是一个打字错误。当然,我的意思是建造,不是建造。谢谢你的回答。你准备好回答一个愚蠢的问题了吗?如果我将.lib文件包含在dll中,该怎么办?“在调试器中运行它,并查看加载dll时加载的其他dll”-使用Delphi 7,不确定具体如何执行,不需要调试器,可以这样做。这是DLL加载问题的第一个工具。是的,我尝试将DLL放入Windows \ Stase32文件夹中,安装VisualC++运行时不应该“在您的环境路径中放置DLL的另一个副本”,除非我误解了某些东西。你看,这个DLL是使用VisualC++的IDE编译的,但是安装VisualC++重新分发的安装它自己的单独的东西。+ 1:在设置项目选项静态链接C++运行时之后编译它。请不要给出这样的建议。如果有两个DLL依赖于该运行时,则针对该运行时的静态链接将是一个问题。你不想让两个DLL都有自己的运行时。Alex谢谢你。Windows版本是用Visual C++ 6编译的,因此需要运行库。“关于这意味着什么?”我可以将“运行库”DLL放在同一个文件夹中吗?如果是,哪些DLL?我必须登记吗?我是否必须运行安装程序(运行时库可再发行安装程序?),以及为什么他们不构建不需要运行时库的DLL。顺便说一下,这个DLL来自版本2.04,有一些工具可以显示它需要的DLL。TDump.exe是Delphi的一部分,alth