我想编写一个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;
}
答案 0 :(得分:4)
加载程序在尝试加载可执行文件并解析其依赖项时会产生错误。该错误意味着加载程序无法执行此操作。
错误代码是NTSTATUS
代码,即STATUS_INVALID_IMAGE_FORMAT
。这几乎总是由于比特不匹配造成的。加载64位DLL的32位主机,反之亦然。
鉴于Delphi 7是32位编译器,您的C ++编译器似乎可能是64位编译器。您需要使用32位编译器编译C ++代码,以便从32位Delphi代码中使用它。