小编Mar*_*ier的帖子

强制Java调用我的C++析构函数(JNI)

我以前会问这个问题,但我在这里找不到......

我已经使用SWIG在C++类周围创建了一个JNI包装器.一切都很好,除了Java似乎永远不会调用类的finalize(),因此反过来,我的类的析构函数永远不会被调用.类的析构函数执行一些最终文件I/O,所以不幸的是,这不仅仅是一个小的内存泄漏.

通过Google搜索,似乎没有办法强制Java到GC并销毁对象.真正?

我知道我可以操作我的SWIG文件并创建一个可以调用C++析构函数的java函数,但是这个类被最终用户用在几种不同的平台/语言中,所以添加一个Java只会造成我们的技术不一致作家们不会喜欢.

c++ java java-native-interface

9
推荐指数
3
解决办法
6719
查看次数

调试的程序窗口不会关闭

我在64位XP机器上使用VS 2008.我正在通过控制台程序调试32位C++ DLL.DLL和EXE项目包含在同一个SLN中,因此我可以在测试时修改DLL.

会发生的是每隔一段时间我就用Debug调试程序 停止调试(Shift-F5).VS停止程序,但控制台窗口保持打开状态!如果我坐在一个断点并按下Shift-F5,它将正常终止,但如果程序在我停止时正在全速运行,我经常会看到它.

最大的问题是我无法关闭这些僵尸窗户.在任务管理器中使用"结束任务"不执行任何操作(无消息,无任何内容 当我关闭机器时,它无法由于孤儿,我不得不求助于实际关闭电源.

我认为这与将DLL和EXE项目放在同一个SLN中有关,就像我在2个VS实例中处理这个项目的几个月一样,一个用于DLL,另一个用于EXE.在我工作的时候,我会不断地在窗户之间来回跳跃.直到我将这两个项目放入单个SLN之后才发生这个问题.单个SLN工作得更好,但这种异常非常令人恼火.

任何人的想法?

UPDATE

经过一些搜索(这里),我发现它似乎与上周二的某个更新(KB977165或KB978037)有关.感谢Microsoft出色的预发布测试.

c++ debugging visual-studio-2008

8
推荐指数
1
解决办法
6544
查看次数

Inno设置:在运行时隐藏/禁用组件

我想在运行时禁用或隐藏其中一个组件选项.我创建了一个带有两个单选按钮的自定义向导页面.如果选择了第一个单选按钮,我希望其中一个组件(CustomInstall)不显示,或者至少被禁用.

当然,自定义页面出现在"组件"页面之前.

我尝试使用Check:参数执行此操作,但似乎在启动时评估[Components]部分,而不是在显示页面时评估.

所以,我的下一个念头,就是一些代码添加到我的CurPageChanged(),这样我可以删除或禁用从CheckListBox(我认为这是所谓的ComopnentsList)的项目,但我找不到任何TNewCheckListBox文档.

有谁知道关于这门课程的更多信息?我的想法会起作用吗?

inno-setup

7
推荐指数
1
解决办法
5920
查看次数

多线程 SQLite 崩溃

我正在尝试在多线程 C++ 程序中使用 SQLite 3.7.5。我把它缩小到几行简单的代码:

sqlite3 *Database;
sqlite3_stmt *Stmt;

int retval=sqlite3_open("database.db3",&Database);
retVal=sqlite3_prepare(&Database,"CREATE TABLE RawData (Key CHAR(5))",-1,&Stmt,0);
retval=sqlite3_step(Stmt);
retval=sqlite3_finalize(Stmt);
Run Code Online (Sandbox Code Playgroud)

当我直接从我的主进程调用此代码时,它工作正常。但是,如果我使用 CreateThread() 创建一个线程:

unsigned long ThreadId;
CreateThread(0,0,(LPTHREAD_START_ROUTINE) InserterThread,&Info,0,&ThreadId);
Run Code Online (Sandbox Code Playgroud)

我在sqlite3_step调用中收到“缓冲区溢出”Visual Studio 消息。如果我调试,我会看到崩溃位置在 dbgook.c 的 _CRT_DEBUGGER_HOOK 中。

我正在使用多线程静态 VC 库,并且正在使用定义进行编译:

SQLITE_THREADSAFE=2
THREADSAFE=2
Run Code Online (Sandbox Code Playgroud)

我已经用sqlite3_threadsafe()进行了验证。

我可以稍微追溯一下 SQLite 3 代码,但我希望有人会发现我的代码存在明显的问题并避免我的烦恼。

c++ sqlite multithreading

6
推荐指数
1
解决办法
2306
查看次数

接口继承和转换

我创建了一个接口,我从另一个(COM)接口继承:

public interface IDTSComponentMetaData : IDTSComponentMetaData90 { }
Run Code Online (Sandbox Code Playgroud)

就是这样.

这背后的原因是,根据我正在使用的SQL Server版本,基数可能是IDTSComponentMetaData90(2005)或IDTSComponentMetaData100(2008).我不想在代码中有条件地编译对IDTSComponentMetaData90/IDTSComponentMetaData100的每个引用,而是使用版本中性接口,它将简单地包装正确的真实接口.

问题是SSIS在一个关键点将一个对象传递给本机接口,我需要将它转换为我的包装器接口:

#if SQL2005
public void Initialize(IDTSComponentMetaData90 c,IServiceProvider s) {
#elif SQL2008
public void Initialize(IDTSComopnentMetaData100 c,IServiceProvider s) {
#endif
  m_ComponentMetaData = (IDTSComponentMetaData) c;
  m_ServiceProvider = s;
}
Run Code Online (Sandbox Code Playgroud)

这没有问题编译,但在运行时,我得到一个'无法将类型'System .__ ComObject'的COM对象转换为接口类型'MyNameSpace.IDTSComponentMetaData'.此操作失败,因为对IID为"{483E01E7-001C-35E4-Ac9f-4B0C1B81E409}"的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULT异常:0x80004002(E_NOINTERFACE)) .

我做的完全错了吗?

c# inheritance

4
推荐指数
1
解决办法
698
查看次数

WCF [DataContract]设置/获取未执行

我对WCF有点新意,我不认为我完全理解DataContracts的交易.我有这个'RequestArray'类:

[DataContract]
public class RequestArray
{
  private int m_TotalRecords;
  private RequestRecord[] m_Record;

  [System.Xml.Serialization.XmlElement]
  [DataMember]
  public RequestRecord[] Record
  { 
    get { return m_Record; }
  }

  [DataMember]
  public int TotalRecords
  {
    get { return m_TotalRecords; }
    set {
      if (value > 0 && value <= 100) {
        m_TotalRecords = value;
    m_Record = new RequestRecord[value];
    for (int i = 0; i < m_TotalRecords; i++)
      m_Record[i] = new RequestRecord();
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这个想法是当客户端说requestArray.TotalRecords=6;Record阵列将被分配和初始化时(我意识到我隐藏了一个分配后面的实现,这是我无法控制的).

问题是当客户端执行此操作时,不会调用TotalRecord的设置代码,服务中的断点也会确认.相反,已经生成了某种通用的setter而是被调用.如何让客户端使用我的setter?

编辑:看起来我并没有完全了解[DataContract]的工作原理,但客户端不会执行此代码是有道理的.就像我在评论中提到的那样,如果我'手动'执行setter的工作,我会看到设置代码在我调用服务函数时正确执行.

序列化我还不确定.RequestRecord []数组的内容不会被转移.Record类有setter/getters,我觉得我需要一个辅助函数来帮助它序列化整个类.

感谢你的帮助!

c# wcf

2
推荐指数
1
解决办法
6728
查看次数

string.Format和单词"Password"

使用C#,我需要从几个AppSettings构建一个连接字符串.如果我这样做:

Connection = string.Format("Data Source={0};Initial Catalog={1);User Id={2};Password={3};",
  ConfigurationManager.AppSettings.Get("CartServer"),
  ConfigurationManager.AppSettings.Get("CartDatabase"),
  ConfigurationManager.AppSettings.Get("CartUserName"),
  ConfigurationManager.AppSettings.Get("CartPassword"));
Run Code Online (Sandbox Code Playgroud)

我得到一个无效的格式字符串异常.我把它缩小到格式字符串的"Password ="部分(即"Passwork ="工作).有一个简单的解决方法:

Connection = string.Format("Data Source={0};Initial Catalog={1);User Id={2};{3}={4};",
  ConfigurationManager.AppSettings.Get("CartServer"),
  ConfigurationManager.AppSettings.Get("CartDatabase"),
  ConfigurationManager.AppSettings.Get("CartUserName"),
  "Password",ConfigurationManager.AppSettings.Get("CartPassword")); // Lame!!!
Run Code Online (Sandbox Code Playgroud)

但是"密码"的真实故事是什么?我检查了MSDN和其他一些网站但是空了.哦,如果重要的话,这是一个WCF服务.

c# string

1
推荐指数
2
解决办法
1681
查看次数

我可以使用其他类的函数作为委托吗?

假设我有2个类,A类和B类.A类创建一个B类实例.A类有一个函数,我想从B类传递给一个方法.

class A {
  void Main(string[] args) {
    B classB=new B();

    DelegateCaller(new delFunction(classB.TheFunction());   // <-- Won't compile (method name expected)
    DelegateCaller(new delFunction(B.TheFunction());        // <-- Won't compile (object reference is req'd)
  }

  public delegate string delFunction();

  public DelegateCaller(delFunction func) {
    System.Console.WriteLine(func());
  }
}

class B {
  public string TheFunction() {
    return "I'm Printing!!!";
  }
}
Run Code Online (Sandbox Code Playgroud)

我不确定它是否是语法问题,或者它只是我不能做的事情.也许我需要在B中定义委托,但在A中引用它?什么B的这个指针?

c#

1
推荐指数
1
解决办法
126
查看次数