在 Win32 API 中,没有直接提供 DPA_DeletePtr 函数。不过,你可以通过结合使用 DPA_DeleteAllPtrs 函数和一个回调函数,来删除指定位置的指针。下面是一个示例:
#include <windows.h>
#include <commctrl.h>

// 回调函数,用于删除指定位置的指针
int CALLBACK DeletePtrAtIndex(void* p, void* pData) {
    // pData 包含要删除的指针的索引
    int nIndex = (int)(intptr_t)pData;
    
    // 如果当前是指定的索引,则删除指针
    if ((intptr_t)n == nIndex) {
        delete p;
        return 0; // 返回 0 以停止删除
    }

    return 1; // 返回 1 继续删除
}

int main() {
    // 初始化 Common Controls 库
    INITCOMMONCONTROLSEX icex;
    icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
    icex.dwICC = ICC_LISTVIEW_CLASSES;
    InitCommonControlsEx(&icex);

    // 创建动态指针数组
    HDPA hDpa = DPA_Create(10);
    if (hDpa == NULL) {
        // 处理错误
        return 1;
    }

    // 向数组中添加指针
    int* pData1 = new int(42);
    DPA_AppendPtr(hDpa, pData1);

    // 向数组中添加另一个指针
    int* pData2 = new int(99);
    DPA_AppendPtr(hDpa, pData2);

    // 要删除的指针的索引
    int nIndexToDelete = 0;

    // 使用 DPA_DeleteAllPtrs 删除指定位置的指针
    DPA_DeleteAllPtrs(hDpa, DeletePtrAtIndex, (void*)(intptr_t)nIndexToDelete);

    // 注意:此时 nIndexToDelete 指向的指针已经被删除,不要再使用它

    // 清理资源
    DPA_Destroy(hDpa);

    return 0;
}

在这个例子中,DeletePtrAtIndex 函数被用作回调函数,当 DPA_DeleteAllPtrs 被调用时,它将被用于删除数组中指定位置的指针。注意,删除后,你不应再使用被删除的指针。

请注意,为了演示清晰,我在代码中省略了一些错误处理,实际应用中应该进行适当的错误检查和处理。


转载请注明出处:http://www.zyzy.cn/article/detail/27252/Win32 API/Dpa_dsa.h/DPA_DeletePtr