我想编写一个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代码中使用它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句