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

时间:2015-03-17 22:07:38

标签: c++ delphi dll delphi-6

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

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;
}

1 个答案:

答案 0 :(得分:4)

加载程序在尝试加载可执行文件并解析其依赖项时会产生错误。该错误意味着加载程序无法执行此操作。

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

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