通过stdcall操作字符串到dll时出现问题 < >我需要创建一个C++ DLL,它将通过STDCALL.< /P>从另一个程序调用。

通过stdcall操作字符串到dll时出现问题 < >我需要创建一个C++ DLL,它将通过STDCALL.< /P>从另一个程序调用。,c++,string,dll,stdcall,C++,String,Dll,Stdcall,所需内容:调用程序将向dll传递字符串数组,dll应更改数组中的字符串值。然后调用程序将继续处理来自dll的这些字符串值 我做了一个简单的测试项目,我显然遗漏了一些东西 这是我的测试C++ DLL: #ifndef _DLL_H_ #define _DLL_H_ #include <string> #include <iostream> struct strStruct { int len; char* string; }; __declspec (

所需内容:调用程序将向dll传递字符串数组,dll应更改数组中的字符串值。然后调用程序将继续处理来自dll的这些字符串值

我做了一个简单的测试项目,我显然遗漏了一些东西

这是我的测试C++ DLL:

#ifndef _DLL_H_
#define _DLL_H_

#include <string>
#include <iostream>

struct strStruct
{
    int len;
    char* string;
};

__declspec (dllexport) int __stdcall TestFunction(strStruct* s)
{
   std::cout << "Just got in dll" << std::endl;

   std::cout << s[0].string << std::endl;
   //////std::cout << s[1].string << std::endl;

   /*
   char str1[] = "foo";
   strcpy(s[0].string, str1);
   s[0].len = 3;

   char str2[] = "foobar";
   strcpy(s[1].string, str2);
   s[1].len = 6;
   */

   //std::cout << s[0].string << std::endl;
   //std::cout << s[1].string << std::endl;

   std::cout << "Getting out of dll" << std::endl;

   return 1;
}

#endif
这是产生的结果:

a1a1a1a1a1
b2b2b2b2b2
Just got in dll
b2b2b2b2b2
Getting out of dll
a1a1a1a1a1
b2b2b2b2b2
我有一些问题:

1) 为什么它在数组的第二个位置而不是第一个位置输出元素

2) 如果我在dll文件中取消注释带注释的行,程序将崩溃。为什么?

3) 显然,我想在dll中做比现在更多的事情(在/**/中的部分),但前两个问题阻碍了我


感谢您的帮助

您无法将字符串[]封送为本机结构

    [DllImport("TestStrLib.dll", CharSet = CharSet.Ansi, 
             CallingConvention = CallingConvention.StdCall)]
             public static extern int TestFunction(string[] s);

      struct strStruct
        {
            int len;
            char* string;
        }

    __declspec (dllexport) int __stdcall TestFunction(strStruct* s);
请阅读各种类型的编组

在C#

在C中++

__declspec(dllexport) int TestFunction( char* ppStrArray[], int size)
   {
       return 0;
   }

谢谢,我从另一个工作程序中获取了该模式…我不明白为什么它不应该与我的测试一起工作,但是您建议使用什么来代替它?事实上,真正的调用方不是C程序,而是MQL4程序…参见,在这里我得到了一个通过结构的C++ DLL传递字符串的当前实现,它是根据其他人工作的,我不确定MQL4是…但是对于C#我已经给了你正确的答案,我让它部分地与你的答案一起工作,但是因为我传递的是两个字符串而不是一个字符串的数组,所以我使用了公共静态extern int TestFunction(strstrstruct[]p);不是向结构传递引用,而是在dll中取消注释/**/代码,现在它正在正确更改字符串值(在dll中的strcpy之后用cout检查)。但是,C#程序中的最后2个Console.WriteLine(在dll调用之后)输出的字符串值与调用之前相同(A1A1A1和B2B2B2B2),因此这就像调用方没有确认从dll所做的更改一样?
    [DllImport( "TestStrLib.dll" )]
    public static extern int TestFunction([In, Out] string[] stringArray
    , int size);
__declspec(dllexport) int TestFunction( char* ppStrArray[], int size)
   {
       return 0;
   }