我不太确定控制台(在"Windows控制台应用程序"),cmd.exe,shell之间的区别.
提前致谢.
我正在开发一个COM DLL并尝试使用__declspec(dllexport)导出DllGetClassObject()方法.
这里是我的报关表:
extern "C" HRESULT __declspec(dllexport) __stdcall DllGetClassObject(REFCLSID rclsid,
REFIID riid, void** ppv)
Run Code Online (Sandbox Code Playgroud)
但我一直得到这个错误:
error C2375: 'DllGetClassObject' : redefinition; different linkage
Run Code Online (Sandbox Code Playgroud)
所以我尝试检查所有DllGetClassObject定义的出现.于是在ObjBase.h中找到了以下一个.
STDAPI DllGetClassObject(__in REFCLSID rclsid, __in REFIID riid, __deref_out LPVOID FAR* ppv);
Run Code Online (Sandbox Code Playgroud)
事实证明,STDAPI是这样的:
#define STDAPI EXTERN_C HRESULT STDAPICALLTYPE
Run Code Online (Sandbox Code Playgroud)
换句话说,它是这样的:
#define STDAPI extern "C" HRESULT __stdcall
Run Code Online (Sandbox Code Playgroud)
根据MSDN:
要导出函数,如果指定了关键字,__ declspec(dllexport)关键字必须出现在calling-convention关键字的左侧.
但我之前提到的声明没有奏效.
我用不同的方法名称测试了我的声明,如下所示:
extern "C" HRESULT __declspec(dllexport) __stdcall f()
{
return S_OK;
}
Run Code Online (Sandbox Code Playgroud)
并且此方法已成功导出.所以这些说明符可以一起使用.似乎Visual C++编译器将STDAPI和extern"C"HRESULT …
我知道这些方法来创建一个实例:
什么时候使用它们?他们有什么不同?什么是展开呢?打开什么?为什么其他两种方法也没有打开?
目前,我有以下医学类比:
关于Unwrap操作,我有一些模糊的感觉,但我不会发布它,直到它更清楚.
我声明了一个Dictionary类型对象,并尝试在其中添加一些项目.但我甚至不能修改项目的价值.密钥不应该是可修改的,但为什么不是值?谢谢.
Dictionary<string, string> dict = new Dictionary<string, string>();
dict.Add("1", "bob");
dict.Add("2", "jack");
dict.Add("3", "wtf");
foreach (string key in dict.Keys)
{
dict[key] = "changed"; //System.InvalidOperationException: Collection was modified
}
Run Code Online (Sandbox Code Playgroud) 在C中,当外部变量以相同的成本服务于其目的时,静态存储类的用途是什么.两者都占用了可执行文件数据段中的存储空间.
我有更好的外部变量范围.如果我希望外部变量的范围是特定文件我不要声明这个变量else where.i看到很多灵活性与全局变量静态局部变量
如果我们有变量的地址,我们可以引用函数外部的局部静态变量.本地静态变量的存储将在数据段中不在函数的堆栈框架中.所以静态存储类带来的独特特性表.
我只是想知道静态是否有任何我不知道的微妙目的.
下面是netty 4.0.24
框架中的一些代码片段.解释B
类型参数有点令人困惑.
public abstract class AbstractBootstrap<B extends AbstractBootstrap<B, C>, C extends Channel> implements Cloneable
{
...
}
Run Code Online (Sandbox Code Playgroud) 我有一个自定义控件具有类型的属性Collection<System.Drawing.Point>
.当我使用CollectionEditor
编辑此属性,则CollectionEditor
窗口显示"Object does not match target type."
为"X"
和"Y"
性能.但如果我System.Drawing.PointF
改用它,那就没有失败.
谁能解释为什么会出现这种差异?
我听过很多关于" 类型系统","强类型语言"等等.目前我正在研究一些.NET COM互操作问题,它解决了"编组"问题.而AFAIK,marshaling则是关于.NET类型和COM类型之间的转换.
在诸如编程语言的许多场景中,当谈论类型时,我们关注逻辑意义.
现在我想知道:"类型"在物理上意味着什么?在某种程度上,我们可以观看和触摸.
我目前的理解是"类型"只不过是计算实体的内存表示.
非常感谢您的回复.
来自MSDN的一些引用:
在托管/非托管边界上编组简单,易于浏览的结构首先要求定义每个本机结构的托管版本.这些结构可以有任何合法的名称; 除了数据布局之外,两个结构的本机版本和托管版本之间没有任何关系.因此,托管版本包含与本机版本大小相同且顺序相同的字段至关重要.(没有机制可以确保结构的托管版本和本机版本是等效的,因此不兼容性在运行时才会变得明显.程序员有责任确保两个结构具有相同的数据布局.)
因此,就Marshaling而言,布局至关重要.
我从这里读到了调整器thunk .这是一些引用:
现在,只有一个QueryInterface方法,但有两个条目,每个vtable一个.请记住,vtable中的每个函数都接收相应的接口指针作为其"this"参数.这对于QueryInterface(1)来说很好; 它的接口指针与对象的接口指针相同.但这对于QueryInterface(2)来说是个坏消息,因为它的接口指针是q,而不是p.
这是调节器雷声进来的地方.
我想知道为什么" vtable中的每个函数都接收相应的接口指针作为其"this"参数 "?它是接口方法用于在对象实例中定位数据成员的唯一线索(基址)吗?
这是我最新的理解:
实际上,我的问题不是关于这个参数的目的,而是关于为什么我们必须使用相应的接口指针作为this参数.对不起我的含糊不清.
除了使用界面指针作为对象布局中的定位器/立足点.只要您是组件的实现者,当然还有其他方法可以做到这一点.
但对于我们组件的客户来说情况并非如此.
当组件以COM方式构建时,组件的客户端对组件的内部结构一无所知.客户端只能占用接口指针,这是将作为this参数传递给接口方法的指针.在这种期望下,编译器别无选择,只能根据这个特定的this指针生成接口方法的代码.
因此上述推理导致了以下结果:
必须确保vtable中的每个函数必须将相应的接口指针作为其" this "参数接收.
在"this pointer adjustor thunk"的情况下,单个QueryInterface()方法存在2个不同的条目,换句话说,可以使用2个不同的接口指针来调用QueryInterface()方法,但编译器只生成1个副本QueryInterface()方法.因此,如果编译器选择其中一个接口作为this指针,我们需要将另一个调整为所选择的接口.这就是这个调节器thunk诞生的原因.
BTW-1,如果编译器可以生成2个不同的QueryInterface()方法实例呢?每一个都基于相应的接口指针.这不需要调整器thunk,但是需要更多空间来存储额外但相似的代码.
BTW-2:似乎有时问题从实施者的角度来看缺乏合理的解释,但可以从用户的指针视角更好地理解.
我们向客户提供了许多反馈和问题报告.它们是纯文本.我们正在尝试为这些文档构建自动分类器,以便将来的反馈/问题可以自动路由到正确的支持团队.除了文本本身,我认为我们应该将客户档案,案例提交区域等内容纳入分类器.我认为这可以为分类器提供更多线索,以便做出更好的预测.
目前,为培训选择的所有功能都基于文本内容.如何包含上述元功能?
(顺便说一下,我是新手.如果这个问题很简单,那么请原谅.)
我目前的方法是首先对原始文本(包括标题和正文)进行一些典型的预处理,例如删除停用词,POS标记和提取重要单词.然后我将标题和正文转换为单词列表,并以稀疏格式存储它们,如下所示:
实例1:word1:word1计数,word2:word2计数,....
实例2:wordX:word1计数,wordY:word2计数,....
对于其他非文本功能,我打算将它们添加为单词列之后的新列.所以最终的例子看起来像:
实例1:word1:word1计数,...,特征X:值,特征Y:值