0

こんにちは、C++ で DLL を作成し、C# で次のように使用しています。

[DllImport("IMDistortions.dll", CallingConvention = CallingConvention.Cdecl)]
public static unsafe extern void ProcessBarrelDistortion(byte* bytes, int stride, int width, int height, byte pixelSize, double a, double b, double c, double d);

すべて正常に動作しますが、この関数は BackgroundWorker DoWork 関数で呼び出しており、コードを使用して関数を停止したいと思います:

if(cancel)return;

私のC ++ DLLでは、キャンセルはワーカーCancelationPendingへのポインターですが、CancelationPendingはプロパティであるため、次のようにポインターを取得できません。

bool *cancel=&worker.CancelationPending;

そして、それを関数の引数として送信します。誰でもこの問題を解決する方法を教えてもらえますか? レポートの進行状況も探していますが、それほど多くはありません。

4

1 に答える 1

0

コールバック関数を使用できます (同様のソリューションを「レポートの進行状況」に適用できます)。

あなたのC++ .dllで

//#include <iostream>

typedef bool ( *CancellationPending)();

extern "C" __declspec(dllexport) void ProcessBarrelDistortion
 (
  unsigned char* bytes, 
  int     stride, 
  int width, 
  int height, 
  unsigned char pixelSize, 
  double a, 
  double b, 
  double c, 
  double d, 
  CancellationPending cancellationPending //callback
 )
{
    bool cancellationPending = cancellationPending();
    if (cancellationPending)
    {
        return;
    }
    //std::cout << cancellationPending;
}

C# プロジェクトで

    public delegate bool CancellationPending();

    [DllImport("YourDll.dll", CallingConvention = CallingConvention.StdCall)]
    public static unsafe extern void ProcessBarrelDistortion
    (byte* bytes, 
     int stride, 
     int width, 
     int height, 
     byte pixelSize, 
     double a, 
     double b, 
     double c, 
     double d,
     CancellationPending cancellationPending);
    static void Main(string[] args)
    {
        var bg = new BackgroundWorker {WorkerSupportsCancellation = true};
        bg.DoWork += (sender, eventArgs) =>
        {
            Console.WriteLine("Background work....");
            Thread.Sleep(10000);
        };
        bg.RunWorkerAsync();
        unsafe
        {
            ProcessBarrelDistortion(null, 0, 0, 0, 0, 0, 0, 0, 0, 
               () => bg.CancellationPending);
        }
        bg.CancelAsync();
        unsafe
        {
            ProcessBarrelDistortion(null, 0, 0, 0, 0, 0, 0, 0, 0, 
                () => bg.CancellationPending);    
        }


    }
于 2013-05-28T17:44:04.733 に答える