2011-11-16 1 views
0

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

を[]文字列をマーシャリングすることはできませんすべてのあなたの助け

答えて

1

。 C++ではC#の

[DllImport("TestStrLib.dll")] 
    public static extern int TestFunction([In, Out] string[] stringArray 
    , int size); 

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

おかげで、よく私は別の作業プログラムからそのパターンを取った...私はそれが私のテストでは動作しない理由を理解するが、何していません代わりに使用することをお勧めしますか? – ibiza

+0

実際、実際の呼び出し元はC#プログラムではなく、むしろMQL4プログラムとなります。http://forum.mql4.com/35537を参照してください。これは、現在の文字列をC++のdllに渡す実装です構造体とそれは他の人に従って動作しています – ibiza

+0

私はMQL4は..ですが、C#のためにあなたの正しい答えを与えました –

関連する問題