- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在尝试使用 Delphi(Turbo Delphi 2006)程序中用 C++ 编写的 DLL 时遇到了一个奇怪的问题。
当我从命令行运行 Delphi 程序(见下文)时,一切正常。另外,当我在没有调试的情况下从 Delphi 环境运行它时 (CTRL+SHIFT+F9),一切都很好。但是,当使用 调试 (F9) 运行它时,出现以下错误:
Project Z:\test.exe faulted with message: 'access violation at 0x00403fdf: read of address 0x00a14e74'. Process stopped. Use Step or Run to continue.
奇怪的是,错误发生在执行最后一个“结束”时。的代码。 Delphi 的 CPU 显示说这是在“UnsetExceptionHandler”中的某个地方,在“FinalizeUnits”之前的四行,更具体地说,在
00403FDF 3901 cmp [ecx],eax
我有点不知所措; Delphi 不是我的领域(我是编写 DLL 的人,现在我需要提供一个使用它的示例程序)。因此,非常感谢有关此问题的任何帮助:)
这是德尔福代码:
program libiup_integration;
{$APPTYPE CONSOLE}
uses
SysUtils,
WinProcs;
type
T_F_GetError = function() : pchar; stdcall;
T_F_SetPath = function(path: pchar) : integer; stdcall;
T_F_GetStrat = function(date: integer;time: single;lat: single;lon: single) : single; cdecl;
var
F_GetError : T_F_GetError;
PF_GetError : TFarProc;
F_SetPath : T_F_SetPath;
PF_SetPath : TFarProc;
F_GetStrat : T_F_GetStrat;
PF_GetStrat : TFarProc;
DLLHandle : THandle;
errormsg : pchar;
h5path : pchar;
h5err : integer;
date : integer;
time : single;
lat : single;
lon : single;
strat : single;
i : integer;
begin
DLLHandle := LoadLibrary('libiup.dll');
if DLLHandle <> 0 then
begin
{ construct the function pointers }
PF_GetError := GetProcAddress(DLLHandle, 'getError');
PF_SetPath := GetProcAddress(DLLHandle, 'setPath');
PF_GetStrat := GetProcAddress(DLLHandle, 'getStrat');
{ If the function pointer is valid ... }
if (PF_GetError <> nil) and (PF_SetPath <> nil) and (PF_GetStrat <> nil) then
begin
{ Assign the function pointer to the function handle }
@F_GetError := PF_GetError;
@F_SetPath := PF_SetPath;
@F_GetStrat := PF_GetStrat;
errormsg := StrAlloc(4096);
h5path := StrAlloc(256);
StrCopy(h5path, 'z:\data\%Y%m.h5');
h5err := F_SetPath(h5path);
if h5err < 0 then
begin
errormsg := F_GetError();
WriteLn(errormsg);
end;
for i := 1 to 10 do
begin
date := 4745;
time := 12.34 + i/10;
lat := -35.321 + i*i;
lon := 115.67 - i*i;
strat := F_GetStrat(date, time, lat, lon);
if strat < 0. then
begin
errormsg := F_GetError();
WriteLn(errormsg);
end;
WriteLn('Value returned by getStrat call no. ' + IntToStr(i) + ': ' + FloatToStr(strat));
end;
{ and finally, delete the function pointers ...}
PF_SetPath := nil;
PF_GetStrat := nil;
PF_GetError := nil;
FreeLibrary(DLLHandle);
WriteLn('Press ENTER to continue ...');
ReadLn;
end
else
{ The function pointer was not valid, so this means that the function was not found in the dll. }
begin
WriteLn('Function not found');
RaiseLastOSError;
end;
end
else
{ The LoadLibrary function did not return a valid DLL handle. }
begin
WriteLn('DLL not loaded');
FreeLibrary(DLLHandle);
WriteLn('Press ENTER to continue ...');
ReadLn;
end;
end.
dll.h
#ifndef LIBIUP_DLL_H_
#define LIBIUP_DLL_H_
#ifdef BUILD_DLL
#define WIN32DLL_API __declspec(dllexport)
#else
#define WIN32DLL_API __declspec(dllimport)
#endif
#include "stratcalc/SimpleStratosphericColumnCalculator.h"
#include <iostream>
#include <string>
#include "boost/date_time/posix_time/posix_time.hpp"
#ifdef __cplusplus
extern "C" { /* Assume C declarations for C++ */
#endif
WIN32DLL_API BOOL __stdcall DllMain( HANDLE, DWORD, LPVOID);
WIN32DLL_API int setPath(char*);
WIN32DLL_API const char* getError();
WIN32DLL_API float getStrat(int, float, float, float);
std::string errormsg;
SimpleStratosphericColumnCalculator* calc;
#ifdef __cplusplus
} /* End of extern "C" */
#endif
#endif
dll.cpp
#ifdef BUILD_DLL
#include "windows.h"
#include "dll.h"
#include <iostream>
// different functions of this library
= new SimpleStratosphericColumnCalculator();
WIN32DLL_API BOOL __stdcall DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
calc = new SimpleStratosphericColumnCalculator();
break;
case DLL_THREAD_ATTACH:
calc = new SimpleStratosphericColumnCalculator();
break;
case DLL_THREAD_DETACH:
delete calc;
break;
case DLL_PROCESS_DETACH:
delete calc;
break;
}
return TRUE;
}
WIN32DLL_API int setPath(char* Path)
{
errormsg = "";
return calc->setPath(Path);
}
WIN32DLL_API const char* getError()
{
std::cout << errormsg << std::endl;
return errormsg.c_str();
}
WIN32DLL_API float getStrat(int Date, float Time, float Lat, float Lon)
{
errormsg = "";
if (Lat < -90. || Lat > 90.)
errormsg += "Latitude value out of bounds.\n";
if (Lon < 0. || Lon > 360.)
errormsg += "Longitude value out of bounds.\n";
if (errormsg != "")
return -1.;
return (float)calc->getStrat(Date, Time, Lat, Lon);
}
#else
#endif
最佳答案
检查调用约定。我在 2 个函数中看到 stdcall,在一个函数中看到 cdecl。尝试将所有内容更改为 stdcall 或 cdecl,看看它是否有效
关于c++ - 从 Delphi 使用 C++ DLL 时出现 AccessViolation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1244441/
此 WPF 应用以 .NET 3.5 为目标,并使用 Visual Studio 2010 的 4.0 工具构建(csc.exe 版本为 4.0.30319.1)。 我不确定我看到的这个异常是怎么回事
这个问题已经有答案了: error in Delphi loadlibrary() (1 个回答) 已关闭10 年前。 我正在尝试在我的 Delphi 项目中加载一个库,该库可以位于两个位置。因此,要
我有一个问题。我正在写入日志文件,但是当我写入时应用程序抛出: **** 中发生类型为“System.AccessViolationException”的未处理异常 附加信息:试图读取或写入 prot
我有一个 Windows 窗体,上面有一些数字(此时只有一个数字)并定期刷新它们(数字是随机生成的)。更新过程与应用程序在一个单独的线程中进行,因此表单可以接收用户单击按钮、调整窗口大小等事件。主要方
当非 UI 线程尝试将其输出附加到 RichTextBox 时,会发生难以跟踪的异常主线程中的 UI 控件。 此异常随机发生,主要是在线程快速连续调用此方法时。它甚至发生在 2 个非 UI 线程中。
我想使用 LockBits 方法更快地比较相似图像,如下所示 using System; using System.Drawing; using System.Drawing.Imaging; usi
我目前正在研究一种解决方案,使错误更易于调试。 所以我有一个已经定义好的 main 并且用户需要定义 wrappermain 来代替 main 的使用: int main(int ac, char**
在各种异步 TCP 操作期间,我不断收到未处理的 AccessViolationException。该异常仅出现在内置函数的反汇编窗口中System.Threading._IOCompletionCa
我正在开发 Windows Phone 8.1 通用应用程序并遇到以下问题。 该应用程序有许多 View 及其相应的 Caliburn.Micro ViewModel,其中两个包含一个 MapCont
我在我的应用程序中使用了第三方工具。在某些系统上,我收到 System.AccessViolation 错误。虽然,通过代码我无法重现该问题。但在生产环境中它有时会重现。 我对下面的代码有疑问 pub
我的表单上有一个 AxWMPLib.AxWindowsMediaPlayer。当我关闭表单时,我收到“尝试读取或写入 protected 内存。这通常表明其他内存已损坏。”异常(exception)。
文件中存在类型为 SECURITY_IDENTIFIER 结构的对象。我需要从此结构中获取所有者 SID。为此,我调用 GetSecurityDescriptorOwner WinAPI 函数并创建
我正在创建 box2d 多边形,我想在将夹具附加到主体的方法之外创建夹具,但是当我这样做时,我遇到了访问冲突。 我已经逐步完成了代码,box2d 肯定正在获取 fixture 对象。 当我在方法内将夹
到目前为止,我可以追踪我在 cocos2dx 应用程序中遇到的每一个错误/崩溃,但现在我觉得自己很笨。我有一个 CCSprite 指针数组,我想做的是在玩家得分为 x 时从缓存中更改它的显示帧。 所有
我在函数中设置两个 XMMATRIX** 类型的变量时遇到了一些问题。函数原型(prototype)如下所示: bool ViewportFactory::CreateViewport(CanvasH
如何在 try-catch 块中捕获 AccessViolation 异常: 这是下面的代码: public static BP GetBloodPressure(string vendorid, s
我在尝试使用 Delphi(Turbo Delphi 2006)程序中用 C++ 编写的 DLL 时遇到了一个奇怪的问题。 当我从命令行运行 Delphi 程序(见下文)时,一切正常。另外,当我在没有
我正在尝试运行以下代码 TCHAR* str1 = TEXT("C:\\Program Files\\Internet Explorer;"); const TCHAR* del = TEXT
我在从 C# 调用 C DLL 时遇到问题 C 函数是(我没有 c 头文件或一个很好的规范:( ) int knr12_read ( char *kn12, char *ik9, char *wok,
我尝试使用 Visual Studio 2013 为 x64 构建我的 Win32 API 项目。但是路由的 WindowProc 回调无法正常工作。我将 SetWindowLongPtr/GetWi
我是一名优秀的程序员,十分优秀!