stdcallによって別のプログラムから呼び出されるC++ dllを作成する必要があります。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番目の位置に要素を出力するのはなぜですか?
2)dllファイルの//////でコメントされた行のコメントを外すと、プログラムがクラッシュします。どうして?
3)はもちろん、私はそれが今何をするかよりも、中に/ * * /)DLL内のより多くの事(の部分をやってみたかったが、私は最初の2つの質問でブロックされています...のための
感謝あなたは、様々なタイプのマーシャリングのためhttp://msdn.microsoft.com/en-us/library/fzhhdwae.aspxをお読みくださいネイティブ構造体として
[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);
を[]文字列をマーシャリングすることはできませんすべてのあなたの助け
おかげで、よく私は別の作業プログラムからそのパターンを取った...私はそれが私のテストでは動作しない理由を理解するが、何していません代わりに使用することをお勧めしますか? – ibiza
実際、実際の呼び出し元はC#プログラムではなく、むしろMQL4プログラムとなります。http://forum.mql4.com/35537を参照してください。これは、現在の文字列をC++のdllに渡す実装です構造体とそれは他の人に従って動作しています – ibiza
私はMQL4は..ですが、C#のためにあなたの正しい答えを与えました –