C++ C++;DLL只向VB应用程序返回第一个字符

C++ C++;DLL只向VB应用程序返回第一个字符,c++,.net,vb.net,pinvoke,C++,.net,Vb.net,Pinvoke,我们的一位技术人员让我写一个小的库文件,他将在其中传递一个文件名和一个整数。库将加载文本文件,并在文件名引用的文本文件中找到整数,然后将字符串返回给他的程序。他正在使用VB作为脚本语言的第三方应用程序中工作 所以,不想担心.NET安装在他安装的设备上的一些旧机器上,我决定破解C++(VS 2010)。我在C开发应用程序开发,上次编译任何C++代码都是VS 6,但是我觉得它有多难?我在这里打字,所以事情发生了决定性的错误。我从C++开始。 #包括 #包括 #包括 BSTR _stdcallrege

我们的一位技术人员让我写一个小的库文件,他将在其中传递一个文件名和一个整数。库将加载文本文件,并在文件名引用的文本文件中找到整数,然后将字符串返回给他的程序。他正在使用VB作为脚本语言的第三方应用程序中工作

<>所以,不想担心.NET安装在他安装的设备上的一些旧机器上,我决定破解C++(VS 2010)。我在C开发应用程序开发,上次编译任何C++代码都是VS 6,但是我觉得它有多难?我在这里打字,所以事情发生了决定性的错误。我从C++开始。

#包括
#包括
#包括
BSTR _stdcallregexconv(BSTR文件名,int modNumber);
BSTR_stdcall regExConv(BSTR文件名,int modNumber){
字符串inText;
//打开文件并从文件中读取文本
ifstream测试文件;
打开(“C:\\Test\\testFile.txt”,ifstream::in);
if(testFile.fail())
MessageBox(空,L“打开失败”,空,空);
while(testFile.good())
getline(testFile,inText);
testFile.close();
_bstr_t passString(inText.c_str());
BSTR finalPass=passString.copy();
返回finalPass;
}
那很好。finalPass给我文本文件中的测试字符串

Locals窗口:
inText“EEE”标准::基本字符串
密码字符串{“eeee”(1)}\bstr\t
最终程序0x00722214“EEEEEEEEEEE”wchar\t*
在VB方面,我有这个

公共类表单1
私有函数testFunc Lib“c:\Development\gTP3200\Debug\gTP3200.dll”(ByVal testVar作为整数)声明为整数
将私有函数stringTest库“c:\Development\gTP3200\Debug\gTP3200.dll”(ByVal Str作为字符串)声明为字符串
私有函数regExConv Lib“c:\Development\gTP3200\Debug\gTP3200.dll”(ByVal fileString为String,ByVal faultedMod为Integer)声明为String
将私有函数stringBack Lib“c:\Development\gTP3200\Debug\gTP3200.dll”()声明为字符串
私有子表单1_Load(ByVal发送方作为System.Object,ByVal e作为System.EventArgs)处理MyBase.Load
作为字符串的Dim retVal
retVal=regExConv(“文件名传递”,3)
端接头
末级
这两个人谈得很好,问题是返回到VB端的字符串只是
inText
中的第一个字符

Locals窗口:
返回“e”字符串
这两天来,我一直在尽我所能地阅读关于它的所有内容,但我开始觉得我在演一部糟糕的巨蟒短剧。似乎没有任何信号起作用。我尝试将字符串转换为各种其他类型,然后再转换回BSTR。试过SysAlloc,没用


如果我将一个字符串作为参数传递给BSTR,然后再次将其传递回(如文件名),那么VB端将读取整个字符串。

您是否尝试过Marshallas

Private Declare Function stringBack Lib "c:\Development\gTP3200\Debug\gTP3200.dll" () As <MarshalAs(UnmanagedType.BStr)> String
Private将函数stringBack Lib“c:\Development\gTP3200\Debug\gTP3200.dll”()声明为字符串

您是否尝试过在VB中声明(并保留一些空间),然后将其作为参数传递给VC++以便VC++填充该缓冲区?我不是专家,但是出现了一个关于使用SysAllocString为BSTR分配内存的快速搜索。我看你试过这个;想详细说明一下你是怎么做到的吗?