簡體   English   中英

Delphi應用程序無法調用簡單的C ++ DLL函數

[英]Delphi application fails to call a simple C++ DLL function

我想編寫一個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代碼中使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM