C++代码转VB代码

huangjinghai 2011-02-12 03:59:20
精通C++与VB语言的牛人帮帮我吧,整了很久都做不出来.
函数SSC_RestoreVal是C++写的DLL里的函数.
//C++代码
//头文件定义
SSC_RestoreVal(const wchar_t* tag, unsigned char** value, unsigned long* valSize);
//函数应用
void RestoreValue()
{
BYTE* valueBuffer = NULL;
DWORD valueBufferSize = 0;
string val;

wstring tag;
wcout << L"Enter value tag name to restore: ";
getline(wcin, tag);

//restore saved value
SscRc rc = SSC_RestoreVal(tag.c_str(), &valueBuffer, &valueBufferSize);
if(S_SSCRC_OK(rc))
{
val.assign((const char*)valueBuffer, valueBufferSize);
wcout << tag <<L" value is: ";
cout << val << endl;
}
else
{
wcout << L"Unable to get requested value: " << rc << endl;
}

//free the buffer
SSC_SecureFreeValBuffer(valueBuffer, valueBufferSize);
valueBuffer = NULL;

return;
}


//VB代码
//函数定义
Public Declare Function SSC_RestoreVal Lib "SscApi.dll" (ByVal tag As String, ByVal Value As String, ByVal valSize As Long)
//应用
Private Sub A_RestoreV_Click()
Dim valueBuffer As String
Dim valueBufferSize As Long
Dim tag As String
Dim val As String
Dim rc As Enum_SscRc
On Error GoTo RestoreError
valueBufferSize = 0
valueBuffer = ""
tag = "abra"
rc = SSC_RestoreVal(tag, VarPtr(valueBuffer), VarPtr(valueBufferSize))
If (S_SSCRC_OK(rc)) Then
' val.assign valueBuffer, valueBufferSize
'CopyMemory val, valueBuffer, valueBufferSize
MsgBox tag & " Value is:" & valueBuffer
Else
MsgBox "Unable to get requested value: "
End If

txtReStoreValue.Text = "valueBuffer:" & CStr(valueBuffer) & " valueBufferSize:" & CStr(valueBufferSize) & " val:" & val

' SSC_SecureFreeValBuffer valueBuffer , valueBufferSize
RestoreError:
MsgBox Err.Description
End Sub


C++代码可正常运行并得到正确结果,但改写为VB后,能获取到值的长度(valueBufferSize),但获取不到值(即:valueBuffer="").
...全文
295 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangjinghai 2011-02-15
  • 打赏
  • 举报
回复
谢谢楼上的,成功了.
Lactoferrin 2011-02-14
  • 打赏
  • 举报
回复
再试试


Public Declare Function SSC_RestoreVal Lib "SscApi.dll" (ByVal tag As Long, ByRef Value As Long, ByRef valSize As Long)
Declare Function MultiByteToWideChar Lib "kernel32.dll" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Private Sub A_RestoreV_Click()
Dim ValueBuffer as String
Dim pvalueBuffer As Long
Dim valueBufferSize As Long,ct as long
Dim tag As String
Dim val As String
Dim rc As Enum_SscRc
On Error GoTo RestoreError
valueBufferSize = 0
valueBuffer = ""
tag = "abra"
rc = SSC_RestoreVal(StrPtr(tag), pvalueBuffer, valueBufferSize)

ct=MultiByteToWideChar(0,1,pvalueBuffer,valueBufferSize,StrPtr(valueBuffer),0)
valueBuffer=Space(ct)
MultiByteToWideChar(0,1,pvalueBuffer,valueBufferSize,StrPtr(valueBuffer),ct)
If (S_SSCRC_OK(rc)) Then
' val.assign valueBuffer, valueBufferSize
'CopyMemory val, valueBuffer, valueBufferSize
MsgBox tag & " Value is:" & valueBuffer
Else
MsgBox "Unable to get requested value: "
End If

txtReStoreValue.Text = "valueBuffer:" & valueBuffer & " valueBufferSize:" & Str(valueBufferSize) & " val:" & val

' SSC_SecureFreeValBuffer pvalueBuffer , valueBufferSize
RestoreError:
MsgBox Err.Description
End Sub
huangjinghai 2011-02-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lactoferrin 的回复:]
你这样
declare function MessageBoxA lib "user32.dll" (byval h as long,byval t as long,byval c as long,byval f as long) as long

然后
MessageBoxA(0,pvalueBuffer,0,0)
看能不能显示出来
[/Quote]
这对话框中得出了正确的值,这怎么弄?
Lactoferrin 2011-02-14
  • 打赏
  • 举报
回复
要不你把那个dll发上来
huangjinghai 2011-02-14
  • 打赏
  • 举报
回复
就是DLL调用的问题.下面这几个函数都是C++写的动态库,现在要在VB里面引用,这人都被拨了层皮还没弄出来.

SscRc SSC_RestoreVal(const wchar_t* tag, unsigned char** value, unsigned long* valSize);

SscRc SSC_StoreFile(const wchar_t* tag, const wchar_t* rpath);

void SSC_SecureFreeValBuffer(unsigned char* ptrToBuffer, unsigned long bufferSize);

这些转为VB然后再调用.更痛苦的是我对VB和C++都不熟.
Lactoferrin 2011-02-14
  • 打赏
  • 举报
回复
你这样
declare function MessageBoxA lib "user32.dll" (byval h as long,byval t as long,byval c as long,byval f as long) as long

然后
MessageBoxA(0,pvalueBuffer,0,0)
看能不能显示出来
波导终结者 2011-02-14
  • 打赏
  • 举报
回复
做成DLL,VB调用。C++转VB很蛋疼,我之前转过一个,后来也干脆用DLL。
huangjinghai 2011-02-14
  • 打赏
  • 举报
回复
麻烦问一句,
val.assign valueBuffer, valueBufferSize

转换为VB里面是怎么个用法?应该是这一句的问题.
我对它的理解是从内存地址valueBuffer中取长度为valueBufferSize的字体
huangjinghai 2011-02-14
  • 打赏
  • 举报
回复
还是valueBuffer还是为空,我看了一下,pvalueBuffer的值为35007352,valueBufferSize长度是正确的.
Lactoferrin 2011-02-14
  • 打赏
  • 举报
回复

看这样行不行

Public Declare Function SSC_RestoreVal Lib "SscApi.dll" (ByVal tag As Long, ByRef Value As Long, ByRef valSize As Long)
Declare Function MultiByteToWideChar Lib "kernel32.dll" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
//应用
Private Sub A_RestoreV_Click()
Dim ValueBuffer as String
Dim pvalueBuffer As Long
Dim valueBufferSize As Long
Dim tag As String
Dim val As String
Dim rc As Enum_SscRc
On Error GoTo RestoreError
valueBufferSize = 0
valueBuffer = ""
tag = "abra"
rc = SSC_RestoreVal(StrPtr(tag), pvalueBuffer, valueBufferSize)
valueBuffer=Space(valueBufferSize)
MultiByteToWideChar(0,0,pvalueBuffer,valueBufferSize,StrPtr(valueBuffer),valueBufferSize)
If (S_SSCRC_OK(rc)) Then
' val.assign valueBuffer, valueBufferSize
'CopyMemory val, valueBuffer, valueBufferSize
MsgBox tag & " Value is:" & valueBuffer
Else
MsgBox "Unable to get requested value: "
End If

txtReStoreValue.Text = "valueBuffer:" & CStr(valueBuffer) & " valueBufferSize:" & CStr(valueBufferSize) & " val:" & val

' SSC_SecureFreeValBuffer valueBuffer , valueBufferSize
RestoreError:
MsgBox Err.Description
End Sub
huangjinghai 2011-02-14
  • 打赏
  • 举报
回复
还是一样的,获取不到值啊.
Lactoferrin 2011-02-12
  • 打赏
  • 举报
回复
掉了一个
Public Declare Function SSC_RestoreVal Lib "SscApi.dll" (ByVal tag As long, ByVal Value As long, ByVal valSize As Long)
Lactoferrin 2011-02-12
  • 打赏
  • 举报
回复
ByVal tag As String不对
ByVal tag As long

Dim p as long
valueBuffer =strconv(valueBuffer ,vbFromUnicode)
p=StrPtr(valueBuffer)
SSC_RestoreVal(StrPtr(tag), VarPtr(p), VarPtr(valueBufferSize))
可用于对VC++C++ Builder、Delphi、VB、C/C++、ASM、Java、C#、SQL 等程序源码进行详细的统计,可以准确的分析出程序中代码行、注释行和空白行的行数。程序会自动根据你选择的文件类型选择相应的统计方式,并将所有文件的分析结果进行汇总,便于方便直观的对软件项目的代码量进行全面的评估。本软件是绿色软件,不需要安装,展开到任意目录,直接运行即可。 1、 支持VC++项目文件的统计方式。 2、 支持C++ Builder项目文件的统计方式。 3、 支持C/C++文件 .cpp 和 .h 的文件统计。 4、 支持同时多个文件的统计方式。 5、 支持同时多种文件类型的统计方式。 6、 支持VB项目文件和 .frm 和 .bas 文件的统计。 7、 支持汇编文件 .asm 和 .inc 的统计。 8、 支持Delphi项目文件 .dpr 和 .pas、.dfm 文件的统计。 9、 支持C#项目文件 .csproj 的直接统计及 .cs 文件的统计。 10、支持Java文件 .java 的统计。 11、支持SQL文件 .sql 的统计。 12、支持 *.* 文件类型的自动分析统计。 13、支持文件目录的选择统计方式。 14、支持用户自定义文件统计类型及统计方法。 15、支持Htm,Excel,Csv,Txt等多种存盘文件类型。 16、支持统计结果的直接打印输出。 17、支持命令行方式的文件及目录统计方式。 18、支持资源管理器右键关联的文件及目录快捷统计方式。

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧