Delphi应用程序无法调用简单的C ++ DLL函数

巴泰克

我想编写一个C ++ DLL,并从Delphi 6应用程序中调用它。我从教程中的简单HelloWorld代码开始,尽管从C ++程序调用时效果很好,但在Delphi应用程序中却导致以下错误消息Delphi 6应用程序中的错误

MyDll.h

#ifndef _MY_DLL_H_
#define _MY_DLL_H_

#if defined MY_DLL
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif

extern "C"
{
    MYDLL_API int HelloWorld();
}
#endif

MyDll.cpp

#define MY_DLL

#include <windows.h>
#include "MyDll.h"

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}

MYDLL_API int HelloWorld()
{
    return 9;
}

此Delphi代码无法调用DLL

function HelloWorld(): LongInt; cdecl; external 'MyDll.dll' name 'HelloWorld';

虽然以下C ++代码可以正常工作

#include <iostream>
#include <windows.h>

typedef int (*HelloWorldFunc)();

int main()
{
    HelloWorldFunc _HelloWorldFunc;
    HINSTANCE hInstLibrary = LoadLibrary("MyDLL.dll");

    if (hInstLibrary)
    {
        _HelloWorldFunc = (HelloWorldFunc)GetProcAddress(hInstLibrary, "HelloWorld");
        if (_HelloWorldFunc)
        {
            std::cout << "HelloWorld result is " << _HelloWorldFunc() << std::endl;
        }
        FreeLibrary(hInstLibrary);
    }
    else
    {
        std::cout << "DLL Failed To Load!" << std::endl;
    }
    std::cin.get();
    return 0;
}
戴维·赫弗南

该错误是由加载器在尝试加载可执行文件并解决其依赖项时产生的。该错误表示加载程序无法执行此操作。

错误代码是一个NTSTATUS代码,即STATUS_INVALID_IMAGE_FORMAT几乎总是由于位不匹配。加载64位DLL的32位主机,反之亦然。

鉴于Delphi 7是32位编译器,因此您的C ++编译器似乎是64位编译器。您将需要使用32位编译器来编译C ++代码,以便从32位Delphi代码中使用它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章