[英]Delphi application fails to call a simple C++ DLL function
我想編寫一個C ++ DLL並從Delphi 6應用程序中調用它。 我從一個教程開始使用簡單的HelloWorld代碼,即使從C ++程序調用它也能很好地工作,在Delphi應用程序中它會導致以下錯誤消息
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.