我做了一个C程序,该程序从二进制文件中读取一些值并将其写入SQLite DB中。我在DLL库中转换了相同的文件,然后从C#的Windows Form App中调用了它。以下是一个说明我要做什么的示例:
在C#中,我使用以下内容
[DllImport("Progress.dll", EntryPoint = "CreateDB", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static extern int avance(IntPtr Path);
DLL C代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stdint.h >
#include <math.h>
#define EXPORT __declspec(dllexport)
EXPORT void CreateDB(int f)
{
for (int i=0;i<4;i++)
{
sleep(1);
f=i+1;
}
}
变量 f 返回我要在进度栏中使用的值。
Exe C代码是:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stdint.h>
#include <math.h>
int main()
{
for (int i=0;i<4;i++)
{
sleep(1);
}
}
现在,我将C程序作为DLL调用,它持续执行了三次。我希望时间与C exe文件非常相似。此外,进度条不会实时更新。
Windows应用程序窗体中的C#代码如下:
private void button7_Click(object sender, EventArgs e)
{
progressBar1.Maximum = 4;
IntPtr strPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(int)));
progressBar1.Value = avance(strPtr);
Application.DoEvents();
}
当进入C DLL的循环正在运行时,如何解决速度问题以及如何更新进度栏?
预先感谢您的帮助。
答案 0 :(得分:0)
您的C#代码调用C函数,就好像它使用了指向int的指针一样。但是根据您的声明,它需要一个简单的int。如果您进行如下更改,它应该可以工作:
EXPORT void CreateDB(int *f)
{
for (int i = 0; i < 4; i++)
{
sleep(1);
*f = i + 1;
}
}