我需要创建一个C ++ dll,它将通过stdcall从另一个程序调用。
需要什么:调用者程序会将一个字符串数组传递给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(/ * * /中的部分)中做更多的事情而不是现在做的事情,但我被前两个问题阻止了......
感谢您的帮助
答案 0 :(得分:1)
您无法将字符串[] 编组为原生结构
[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);
请阅读http://msdn.microsoft.com/en-us/library/fzhhdwae.aspx以了解各种类型的编组。
在C#中
[DllImport( "TestStrLib.dll" )]
public static extern int TestFunction([In, Out] string[] stringArray
, int size);
在C ++中
__declspec(dllexport) int TestFunction( char* ppStrArray[], int size)
{
return 0;
}