如何将char*从C dll传递给VB
这是示例代码:
void Cfunc(char *buffer,int len)
{
BSTR buf_bstr = SysAllocString((BSTR)buffer);
VBptr.VBfunc(buf_bstr,len);
}
Run Code Online (Sandbox Code Playgroud)
此功能不起作用,实际上其他一些值被发送到VB而不是实际值.
有人可以建议一个解决方案?
在阅读了什么是空终止字符串的基本原理?我发现在C#/.中,一些类似的问题在内部,Net字符串都是长度前缀和null终止,就像在BSTR数据类型中一样.
字符串是长度前缀还是空终止而不是例如的原因是什么.只有长度 - 前缀?
任何人都知道如何将BSTR转换为char*?
更新:我试图这样做,但不知道它是对还是错.
char *p= _com_util::ConvertBSTRToString(URL->bstrVal);
strcpy(testDest,p );
Run Code Online (Sandbox Code Playgroud) 由于BSTR只是typedef对wchar_t*我们的代码库,其中字符串文字传递给方法的几个(许多?)的地方期待BSTR这可以胡来了marshallers或任何人谁尝试使用任何BSTR特定的方法(比如SysStringLen).
有没有办法静态检测这种滥用?
我尝试使用VC10 /Wall和静态代码分析Microsoft All Rules进行编译,但是以下任何一个代码都没有被其中任何一个标记.
void foo(BSTR str)
{
std::cout << SysStringLen(str) << std::endl;
}
int _tmain()
{
foo(L"Don't do that");
}
Run Code Online (Sandbox Code Playgroud)
更新:在试图破坏wtypes.h我已经放弃的这些违法行为之后.
我尝试了两条路径,这两条路径都是我上面的示例程序,但是一旦我尝试了一个真正的项目,它们就失败了.
BSTR但是由于一个VARIANT有一个BSTR联合成员的类,新类不能有任何构造函数或赋值运算符,这个被破坏的每个地方都NULL被视为一个BSTR.我尝试NULL用具有转换运算符的类型替换但在添加了几十个新运算符(比较,转换等)之后,我开始遇到模糊的调用而放弃了.BSTR使用typedef另一种类型的指针).这也没有用,在添加toBSTR和fromBSTR乱丢comutil.h(_bstr_t)和其他转换的地方之后,我终于到了编译器在IDL生成的标题处被阻塞的点(默认值被转换为文字宽字符串).总之,如果有人知道一个代码分析工具可以帮助我很高兴听到它,我已经放弃了尝试自己实现这个目标.
我有一个_bstr_t变量bstrErr,我有一个CString变量csError.如何设置该进来的价值bstrErr来csError?
在维护COM接口时应该BSTR像对待空方式一样对待NULL?换句话说,这两个函数调用应该产生相同的结果吗?
// Empty BSTR
CComBSTR empty(L""); // Or SysAllocString(L"")
someObj->Foo(empty);
// NULL BSTR
someObj->Foo(NULL);
Run Code Online (Sandbox Code Playgroud) 好的,所以我真的不能想到一个总结这个的apropos标题.
IPrintPipelinePropertyBag接口具有AddProperty方法,该方法恰当地"将属性添加到属性包".
http://msdn.microsoft.com/en-us/library/aa506384.aspx
AddProperty([in,string] const wchar_t*pszName,[in] const VARIANT*pVar);
我们使用以下代码将字符串添加到属性包中.
CComVariant varProperty = CComBSTR(someString);
pPrintPropertyBag->AddProperty(L"SOME_PROPERTY", &varFilename);
Run Code Online (Sandbox Code Playgroud)
但是很明显,创建的CComBSTR和CComVariant在一段时间后超出了范围.我不确定PropertyBag是否处理字符串并制作自己的副本.由于我们可以在VARIANT中存储各种内容,因此情况并非如此.
假设没有处理字符串,我的问题是,在COM中执行此操作的模式是什么?我应该如何传递包含已分配字符串的VARIANT,使该字符串可用于其他线程,即使调用AddProperty的线程首先死亡,并正确地取消分配字符串?
我有一个_bstr_t包含日文文本的字符串.我想将此字符串转换为UTF-8字符串,该字符串定义为a char *.
我可以将_bstr_t字符串转换为char *(UTF-8)字符串而不会丢失日文字符吗?
这样做的正确方法是什么:
_bstr_t description;
errorInfo->GetDescription( &description.GetBSTR() );
Run Code Online (Sandbox Code Playgroud)
要么:
_bstr_t description;
errorInfo->GetDescription( description.GetAddress() );
Run Code Online (Sandbox Code Playgroud)
在哪里IError:GetDescription定义为:
HRESULT GetDescription (BSTR *pbstrDescription);
Run Code Online (Sandbox Code Playgroud)
我知道我可以轻松地做到这一点:
BSTR description= SysAllocString (L"Whateva"));
errorInfo->GetDescription (&description);
SysFreeString (description);
Run Code Online (Sandbox Code Playgroud)
谢谢
我的工作与功能的COM对象库,它返回一个VARIANT带有SAFEARRAY的BSTR秒.如何显示此VARIANT实例的值并将其保存在TStringList?我试着在网上搜索没有明确的答案.
我尝试了以下但没有成功:
Variant V;
String mystr;
VarClear(V);
TVarData(V).VType = varOleStr;
V = ComFunction->GetValues(); //<<<<----- V is empty
mystr = (wchar_t *)(TVarData(V).VString);
Memo1->Lines->Add(mystr);
VarClear(V);
Run Code Online (Sandbox Code Playgroud)