我是一个为客户开发C++ Windows应用程序的人.在过去的几个月里,我们遇到了同样的问题,即客户机器上缺少DLL依赖项.尽管我付出了最大的努力,但仍然会出现问题,我们会发回电子邮件.我的老板和老板的老板对我很生气,顾客也不高兴.
我希望你们可以提供帮助,就如何按顺序获得可交付成果提出建议/想法.在一些明显的事情之前:
我厌倦了为这些东西加热.我错过了什么,我可以做什么?在雇主的支持方面我应该问什么?我应该如何以他们提供的方式要求提供支持?
更新:
鱼雷鱼雷.他们不希望我花费我所有的时间来设置和拆除客户配置.相反,我现在正在与客户合作以获得基本配置,以便我知道我应该针对的确切机器设置.如果不符合该规范,我不再需要关心.至少有些事情发生了......虽然我还是喜欢试机.
我有一个旧的DLL停止工作(log2vis.dll),我想查看它内部,看看它使用了什么对象.
DLL是用C++(而不是.NET)编写的.有没有一个工具可以反编译/反汇编C++文件?
我正在使用EmguCV进行项目,当我们的程序运行时,它需要一些像"cxcore.dll"等dll(或者它会抛出运行时异常).目前,我将文件放在输出文件夹的根目录中(在Visual Studio的文件属性中选择"始终复制").
然而它看起来有点凌乱,只有10个不同的dll.有没有我可以将它移动到输出文件夹中的子文件夹,它仍然会找到它.
我为sox编译了libmad.当我尝试读取mp3时,我收到此消息:
sox FAIL util:无法加载MAD解码器库(libmad)函数"mad_stream_buffer".
我是否错误地编译了项目?
我已经阅读了有关如何不在一个DLL中分配堆内存并从该DLL外部解除分配的各种事项.但是抛出一个只是临时的异常对象(如大多数异常对象)呢?例如:
throw my_exception( args ); // temporary: no heap allocation
Run Code Online (Sandbox Code Playgroud)
当异常对象被捕获到DLL外部时,最终将执行该对象的析构函数,并将回收该对象的非堆内存.这样可以,因为它不是堆内存吗?
当我ntsd -d
通过管道传输时,我无法在windbg中显示源代码windbg -k
,但是当我在本地调试时它可以工作.
我想调试Winlogon.exe和LSASS.exe的第一个代码执行.但为了便于重现问题,我编写了这个设置:
/noexecute=optin /fastdetect /debug /debugport=com1 /baudrate=115200
我可以使用此命令在本地进行调试,从C:\ CrashMe启动:
windbg -g -G -srcpath C:\CrashMe -y C:\CrashMe debug\CrashMe.exe
Run Code Online (Sandbox Code Playgroud)
我可以启动Windows XP虚拟机并使用以下命令连接到它:
windbg -n -k com:pipe,port=\\.\pipe\com_1,reconnect -srcpath SRV*;C:\CrashMe -y
c:\windows\system32;c:\windows\symbols;C:\CrashMe\debug
Run Code Online (Sandbox Code Playgroud)
但我需要调试远程机器.在目标上,我有这些选择:
-server
和调试-remote
在每个选项中,我都可以看到符号(x crashme!*
作品).
我不能使用#1(-server
)或#2(breakin.exe <pid>
),因为我想调试身份验证提供程序的启动代码,所以我需要LSASS.exe
从下开始ntsd -d
.我不能让它运行并在以后附加.
我的理解是我需要使用IFEO.使用gflags.exe而不是手动修改注册表,我将可执行选项设置为
c:\dtw\ntsd -d -G -lines -x -y c:\symcache;c:\windows\system32 -n -srcpath C:\CrashMe\ …
Run Code Online (Sandbox Code Playgroud) E:\Code\Java\JNITest>java test
Exception in thread "main" java.lang.UnsatisfiedLinkError: E:\Code\Java\JNITest\test.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at test.main(test.java:16)`
Run Code Online (Sandbox Code Playgroud)
在使用Java Native Interface时,我遇到了一个产生此错误的问题.我相信这是因为我使用MinGW编译了.dll,它编译成32位.dll而我的系统是64位,因此我的Java运行在64位.反正有没有迫使我的Java以32位运行?
我有一个DLL,我使用AllocConsole()和cout来显示数据以进行调试.
它曾经工作正常但是因为我将我的编译器(Visual Studio 2012)更新到最新的dll只显示控制台而不是print/couts.
我不明白为什么会发生这种情况.
有任何想法吗?
我的部分代码
__declspec(dllexport) INT APIENTRY DllMain(HMODULE hDLL, DWORD Reason, LPVOID Reserved)
{
switch(Reason)
{
case DLL_PROCESS_ATTACH:
AllocConsole();
DisableThreadLibraryCalls(hDLL);
//
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)pSend, MySend);
if(DetourTransactionCommit() == NO_ERROR)
cout << "[" << MySend << "] successfully detoured." << endl;
Run Code Online (Sandbox Code Playgroud)
但是什么都没有显示
我查看了所有与堆栈溢出相关的问题,但没有一个解决方案对我有帮助.
我正在使用此设置构建Qt应用程序:
configure -developer-build -debug-and-release -opensource -nomake examples -nomake tests -platform win32-msvc2012 -no-opengl
QMAKE_CXX += /D_USING_V110_SDK71_
我可以在我的开发机器上构建和运行我的程序(如上所述); 我也可以在dev机器上的Program Files目录下安装和运行包.
当我在Windows Vista计算机上安装并运行时(多台计算机)
(在Windows 7的全新安装上也失败了)
我明白了:
Application failed to start because it could not find or load the QT platform plugin "windows"
所以我按照说明添加了.platforms /目录,并添加了qwindows.dll(还添加了qminimal.dll和qoffscreen.dll); 我还添加了libEGL.dll,libGLESv2.dll(即使我不应该需要它们,我不认为)
一旦我添加了qoffscreen.dll,我现在得到了额外的消息: Available platform plugins are: offscreen
如果我通过Dependency Walker运行,我会列出以下错误:
GetProcAddress(0x76CA0000 [KERNEL32.DLL], "GetCurrentPackageId") called from "MSVCR110.DLL" at …
Run Code Online (Sandbox Code Playgroud) 我玩了RegSvr32.exe
注册COM服务器并获得下一个退出代码:
0
- 正确注册正常的DLL Com Server时
3
- 尝试注册假DLL Com Server时(简单文本文件重命名为.DLL
4
- 尝试注册简单的DLL时,而不是Com Server
问题:我可以在哪里找到所有可能的退出代码及其含义的官方(或非官方但好的)描述?
在互联网上搜索没有给我结果,所以我发现这个主题在哪里写的退出代码与Windows系统错误代码相同,但我不明白为什么然后当尝试注册坏文件我得到代码= 3
= ERROR_PATH_NOT_FOUND
,并在注册非COM DLL时 - 4
= ERROR_TOO_MANY_OPEN_FILES
?对我来说,这听起来并不合乎逻辑.