0
我需要創建一個C++ dll,它將通過stdcall從另一個程序中調用。通過stdcall操作字符串到DLL的問題
什麼是需要的:調用者程序將傳遞一個字符串數組到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
,這裏是我使用來測試一個簡單的C#程序我的測試DLL:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace TestStr
{
class Program
{
[DllImport("TestStrLib.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int TestFunction(string[] s);
static void Main(string[] args)
{
string[] test = new string[2] { "a1a1a1a1a1", "b2b2b2b2b2" };
Console.WriteLine(test[0]);
Console.WriteLine(test[1]);
TestFunction(test);
Console.WriteLine(test[0]);
Console.WriteLine(test[1]);
Console.ReadLine();
}
}
}
這裏是產生的輸出:
a1a1a1a1a1
b2b2b2b2b2
Just got in dll
b2b2b2b2b2
Getting out of dll
a1a1a1a1a1
b2b2b2b2b2
我有一些問題:
1)爲什麼它輸出數組的第二個位置,而不是在第一個位置?
2)如果我取消在dll文件中用//////註釋的行註釋,程序崩潰。爲什麼?
3)很顯然,我想要做的DLL中的更多的東西(的部分中/ * * /),比它做什麼的權利,但我第一2個問題受阻......
感謝所有的幫助
感謝,以及我從另一個工作程序,模式...我不明白爲什麼它不應該與我的測試工作,但什麼你會建議使用嗎? – ibiza
事實上,真正的調用者不會是C#程序,而是MQL4程序...請參閱http://forum.mql4.com/35537,這是我獲得當前實現將字符串傳遞給C++ dll一個結構,它是根據其他人的工作 – ibiza
我不確定MQL4是..但對於C#我給你正確的答案 –