2

>我之前的话题<

我创建了这个,因为我在 VMBox 上安装了 WinXP,但我无法让它再次工作。

这次我在表单上创建了一个 OnLoad 事件

        if (LoadLibrary("blowfish.dll") == 0)
        {
            Misc.LogToFile("Could not load dll", true);
            Application.Exit();
        }

在我的 PC 上运行良好,但在 VMBox LoadLibrary 上返回 0。

一些用户提到问题在于将旧的 NET Framework(2.0) 与在最新的 MS Visual Studio(2008 SP1) 上制作的 dll 混合在一起,所以我采取了行动,现在它设置为与 NET 3.5 一起使用的程序属性

在 VMBox 上,我有 NET 2.0,但这不是问题 - 程序本身运行良好。我也有 C++ Redistributable(2005、2005 SP1 和 2008)。

可能是什么问题呢?

4

4 回答 4

3

如果你可以打电话给进一步的麻烦

Marshal.GetLastWin32Error();

这应该给你一个错误代码。

您是否可能部署了本机 dll 的调试版本,它还需要 MSVCR90 D .DLL 的调试版本?您应该已经分发了发布版本,因为调试版本需要在目标系统上存在一组不同的 dll。

它显然适用于您的开发机器,因为所需库的所有调试版本都带有 Visual Studio。

这是您将如何获得属于错误代码的消息的方式:

[DllImport("kernel32.dll")]
private static extern int FormatMessage(int dwFlags,
    IntPtr lpSource, int dwMessageId, int dwLanguageId,
    out string lpBuffer, int nSize, IntPtr pArguments);

public static string GetErrorMessage(int errorCode)
{
    const int FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100;
    const int FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200;
    const int FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000;

    string lpMsgBuf;
    int dwFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER
        | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS;

    int retVal = FormatMessage(dwFlags, IntPtr.Zero, errorCode, 0,
                                out lpMsgBuf, 0, IntPtr.Zero);
    if (0 == retVal)
    {
        return null;
    }
    return lpMsgBuf;
}
于 2009-04-09T18:32:49.013 回答
1

在 LoadLibrary 之后调用 GetLastError,在此处检查错误代码值:http: //msdn.microsoft.com/en-us/library/ms681381.aspx 看看是否有帮助。

于 2009-04-09T18:31:23.683 回答
0

可能是 dll 的位置在一个环境中的路径上,而不是在另一个环境中。也可能是一个环境中的权限与另一个环境不同。

于 2009-04-09T18:21:57.853 回答
0

尝试在 DLL 上运行依赖walker - 查看是否缺少任何模块。

于 2009-04-09T18:24:55.197 回答