C++ 访问冲突写入 mql4 中的 dll 中的 0x00000000

标签 c++ dll mql4

首先,我是 C++ 的新手(学习了将近一周),所以如果这很明显,请原谅我。另外,我已经搜索了许多具有类似问题的帖子。要么我的理解不够深入,要么没有相关信息可以帮助我理解这个问题。

在 Metatrader 4 中,我试图找出如何将结构变量传递给 dll,并修改存储在所述结构中的变量。到目前为止,即使在处理结构数组时,我也取得了巨大的成功。然后我遇到了一个问题。

我已将问题缩小到字符串的使用。如果愿意,请查看下面的代码,我用它来专注于解决这个问题,并帮助我理解为什么每当我尝试在 mt4 中运行脚本时,我总是收到这个“访问冲突写入 0x00000000”错误.

mql4 代码:

struct Naming
{
  string word;
} name;

#import  "SampleDLLtest.dll"
bool     NameTest(Naming &name);
#import

int init() { return(0); }

int start()
{
   Print("original name: ", name.word);
   if( NameTest( name ) )
   {
     Print("new name: ", name.word);
   }

   //---
   return(0);
}

这是相关的dll代码:

#define WIN32_LEAN_AND_MEAN
#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>

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);
}

struct Naming
{
   std::string n_name;
};

bool __stdcall NameTest(Naming *name)
{
   name->n_name = "Captain Success";

   return true;
}

最佳答案

来自 mql4 的文档:http://docs.mql4.com/basis/preprosessor/import

The following can't be used for parameters in imported functions:

  • pointers (*);
  • links to objects that contain dynamic arrays and/or pointers.

Classes, string arrays or complex objects that contain strings and/or dynamic arrays of any types cannot be passed as a parameter to functions imported from DLL.

导入的函数接受一个指针,而这显然不受 mql4 的支持。

您可能应该使用固定大小的字符数组来将数据传入和传出 dll:

喜欢:

struct Naming {
  char m_name[255];
}

该函数需要接受对该结构的引用(但这可能也不被支持)或直接接受该结构并返回该结构。

Naming NameTest(Naming name) {

  strncpy(name.m_name, "New Content", sizeof(name.m_name) -1);
  if (sizeof(name.m_name) > 0) {
      name.m_name[sizeof(name)-1] = 0;
  }
  return name;
}

调用它看起来像这样:

name = NameTest(name);

关于C++ 访问冲突写入 mql4 中的 dll 中的 0x00000000,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30724128/

相关文章:

dll - ArcGISRuntime SDK version100.11 的 SideBySide 问题

c++ - Windows 上的共享库 - 使用错误的 dll 的依赖项

mql4 - 随着利润的增加,如何在止损和当前价格之间保持 10 个点的利润差距

c++ - 如何解决 MQL4 序列化问题?

mql4 - 如何为 MT4 StrategyTester 回测集成新闻源指标?

c++ - 对象构造 : default parameter vs delegation

c++ - 在 Windows 与 Linux 中运行 C++ 程序

c++ 为什么对象的拷贝不允许访问原始对象的私有(private)变量?

c++ - OpenCV:Mat::reshape() 什么都不做

java - 从 Java 获取 native 动态库文件扩展名